タイム クリティカルな関数で、比較的短いメモリ シーケンス (1 KB 未満、通常は 2 ~ 200 バイト) をコピーしたいと考えています。CPU側でこれに最適なコードはrep movsd
. ただし、コンパイラにこのコードを生成させることはできません。memcpy を使用すると、コンパイラの組み込み組み込み関数を使用してこれが行われることを望んでいましたが (漠然とそうしていたのを覚えています)、逆アセンブリとデバッグに基づいて、コンパイラは代わりに memcpy/memmove ライブラリ実装への呼び出しを使用しているようです。また、コンパイラが次のループを認識して単独で使用できるほどスマートであることを願っていましrep movsd
たが、そうではないようです。
char *dst;
const char *src;
// ...
for (int r=size; --r>=0; ) *dst++ = *src++;
rep movsd
インライン アセンブリを使用する以外に、Visual Studio コンパイラでシーケンスを生成する方法はありますか?