固定サイズの配列に対する動的メモリ割り当ての制御
MATLAB® Coder™ によって生成されたコードは、サイズが指定したしきい値よりも小さい固定サイズの配列に対してプログラム スタックにメモリを割り当てます。たとえば、次のコードでは Z
は固定サイズの 1 行 4 列の配列です。
function Z = myfcn() Z = zeros(1,4); end
動的メモリ割り当てでは、プログラム スタックではなくヒープ上でメモリを割り当てます。スタック メモリを使い尽くす可能性がある大きな固定サイズの配列では、動的メモリ割り当てを検討してください。
動的メモリ割り当てによって、生成されたコードの実行速度が遅くなる場合があります。
固定サイズの配列に対する動的メモリ割り当ての有効化
既定では、固定サイズの配列に対する動的メモリ割り当ては無効になっています。次のいずれかの方法を使用して有効にします。
コード生成の構成オブジェクトで、
EnableDynamicMemoryAllocation
プロパティおよびDynamicMemoryAllocationForFixedSizeArrays
プロパティをtrue
に設定します。MATLAB Coder の [メモリ] 設定で、[動的メモリ割り当てを有効化] と [固定サイズの配列に対する動的メモリ割り当てを有効化] を選択します。
固定サイズの配列の動的メモリ割り当てしきい値の設定
固定サイズの配列に対する動的メモリ割り当てが有効になっている場合、コード ジェネレーターは、サイズ (バイト単位) が動的メモリ割り当てしきい値以上の固定サイズの配列に対してヒープ上でメモリを動的に割り当てます。
動的メモリ割り当ての既定のしきい値は 64 キロバイトです。しきい値を構成するには、以下のいずれかを使用します。
コード生成の構成オブジェクトで、
DynamicMemoryAllocationThreshold
プロパティの値を設定します。MATLAB Coder の [メモリ] 設定で、[動的メモリ割り当てしきい値] の値を設定します。
固定サイズの配列のコード生成
2 つの大きな固定サイズの配列 a
と b
の積を計算する MATLAB 関数を定義します。
function y = productLargeSize(a,b) y = a*b; end
cfg = coder.config('lib'); cfg.VerificationMode="SIL"; cfg.DynamicMemoryAllocationForFixedSizeArrays = true; t = coder.typeof(0,[1e4 1e4]); codegen productLargeSize -args {t,t} -config cfg - report
固定サイズの配列に対する動的メモリ割り当てを有効にすることで、配列 a
および b
はヒープ上で動的に割り当てられ、スタック オーバーフローが回避されます。
生成コード
... void tlargeSize(const emxArray_real_T *a, const emxArray_real_T *b, emxArray_real_T *y) { const double *a_data; const double *b_data; double *y_data; ...
使用に関するメモと制限
固定サイズの配列に対する動的メモリ割り当てが有効になっている場合、以下のとおりです。
生成コード内の関数の入力変数と出力変数は以下のようになります。
C++ コード生成の場合は
coder::array
変数。生成された関数インターフェイスでの動的に割り当てられた C++ 配列の使用を参照してください。C コード生成の場合は
emxArray
構造体。生成された関数インターフェイスでの C 配列の使用を参照してください。
固定サイズの配列のフィールドをもつ
struct
オブジェクトをcoder.ceval
またはコード置換ライブラリ (CRL) に渡す場合、C/C++ 関数シグネチャを更新する必要があります。
メモ
固定サイズの配列に対する動的メモリ割り当ての有効化は、GPU コード生成ではサポートされていません。
参考
coder.EmbeddedCodeConfig
| coder.MexCodeConfig
| coder.CodeConfig