30

どのような状況で memcpys が最新の INTEL/AMD ハードウェアの割り当てよりも優れていると期待できますか? 私は 32 ビット Intel プラットフォームで GCC 4.2.x を使用しています (ただし、64 ビットにも関心があります)。

4

1 に答える 1

44

それらが割り当てよりも優れていると期待するべきではありません。その理由は、(最適化フラグを使用する場合) コンパイラがより高速であると判断した場合、とにかく memcpy を使用するためです。そうでない場合、および構造体がレジスタに収まるほど小さい場合は、メモリアクセスをまったく必要としない直接レジスタ操作を使用できます。

GCC には、いつレジスタ/メモリ セルを直接変更するか、いつ memcpy 関数を使用するかを判断する特別なブロック移動パターンが内部的にあります。構造体を割り当てるとき、コンパイラはコンパイル時に移動の大きさを認識しているため、たとえば、小さなコピーをアンロールできます (ループする代わりに n 回連続して移動します)。注-mno-memcpy:

-mmemcpy
-mno-memcpy
    Force (do not force) the use of "memcpy()" for non-trivial block moves.  
    The default is -mno-memcpy, which allows GCC to inline most constant-sized copies.

コンパイラ自体より memcpy をいつ使用するかを誰がよく知っていますか?

于 2008-11-27T15:24:49.827 に答える