Main Content

生成されたコード内の変数の余分なコピーを排除する

余分なコピーができる状況

C/C++ コード生成中、コード ジェネレーターは初期化されていないメモリにアクセスしようとするステートメントをチェックします。使用されているにもかかわらず未定義の可能性がある変数が存在する実行パスが検出されると、コンパイル時エラーが発生します。このエラーが発生しないようにするには、変数を演算で使用する前または関数の出力として返す前に代入によって定義します。

ただし、その変数の代入では、新しい変数に対して、割り当てるデータのプロパティがコピーされるだけではなく、新しい変数が代入された値に初期化されることに注意してください。この強制的な初期化によって、C/C++ コードに余分なコピーが生まれる場合があります。余分なコピーを排除するには、未初期化変数を定義することにより余分なコピーを排除する方法に説明されているように、関数 coder.nullcopy を使って初期化されていない変数を定義します。

未初期化変数を定義することにより余分なコピーを排除する方法

  1. coder.nullcopy で変数を定義します。

  2. 変数を初期化してから読み取ります。

    未初期化変数が配列の場合、その配列を関数あるいは演算子の入力として渡す前にすべての要素を初期化しなければなりません。渡す先の関数や演算子が配列の未初期化部分から読み取りを行わない場合でも同様です。

     未初期化データにアクセスしたときに発生する動作

未初期化変数の定義

以下のコードでは、代入ステートメント X = zeros(1,N)X を 1 行 5 列の実数で double のベクトルとして定義すると同時に、X の各要素を 0 に初期化しています。

function X = withoutNullcopy %#codegen

N = 5;
X = zeros(1,N);
for i = 1:N
    if mod(i,2) == 0
        X(i) = i;
    elseif mod(i,2) == 1
        X(i) = 0;
    end
end

この強制的な初期化によって、生成されたコードに 1 つ余分なコピーができます。このオーバーヘッドを排除するためには、以下のように X の定義で coder.nullcopy を使用します。

function X = withNullcopy %#codegen

N = 5;
X = coder.nullcopy(zeros(1,N));
for i = 1:N
    if mod(i,2) == 0
        X(i) = i;
    else
        X(i) = 0;
    end
end

参考

関連するトピック