メインコンテンツ

memset の最適化

リテラル定数を連続する配列要素に代入する生成されたコードを最適化するために、コード ジェネレーターはこのコードを memset 呼び出しに置き換えることを試みます。memset 呼び出しは、for ループまたは複数の連続する要素の代入よりもさらに効率的です。次の表は、memset を使用した場合と使用しない場合の生成された C コードの例を示しています。

memset 最適化を行って生成されたコードmemset 最適化を行わずに生成されたコード
 memset(&Y[0], 125, 100U * sizeof(signed char));
for (i = 0; i < 100; i++) {
    Y[i] = 125;
memset(&Z[0], 0, 1000U * sizeof(double));
Z[0] = 0.0;
Z[1] = 0.0;
Z[2] = 0.0;
...
Z[999] = 0.0;

コード ジェネレーターは、整数の定数または浮動小数点ゼロの代入に memset 最適化を使用できます。memset を使用するかどうかは、以下によって決まります。

  • 代入する値のサイズ。サイズは、C/C++ の memset 呼び出しの要件を満たしていなければなりません。

  • 代入するバイト数。代入するバイト数は、C/C++ データ型に必要なバイト数を配列要素数に乗算した値です。

    • 代入する要素数がコンパイル時に既知の場合、コード ジェネレーターはバイト数がしきい値以上である場合にのみ memset 呼び出しを生成します。

    • 要素数がコンパイル時に不明な場合、コード ジェネレーターはしきい値に関係なく memset 呼び出しを生成します。

memset 最適化のしきい値は memcpy 最適化のしきい値と同じです。既定のしきい値は 64 バイトです。しきい値を変更するには、次のいずれかの方法を使用します。

  • コード構成オブジェクトで、MemcpyThreshold プロパティの値を指定する。

  • [コード生成設定] ダイアログ ボックスで、[memcpy しきい値 (バイト)] パラメーターの値を指定する。

既定では、コード ジェネレーターは float と double のゼロの代入に対して memset 最適化を使用します。memset 最適化を無効にするには、次のいずれかの方法を使用します。

参考

トピック