20

memcpyGCCには C99/posix 関数のバージョンがあります: __builtin_memcpy.

GCC によって memcpy のインライン バージョンに置き換えられる場合もあれば、libc の memcpy への呼び出しによって置き換えられる場合もあります。たとえば、ここに記載されていました:

最後に、コンパイラに関する注意事項として、__builtin_memcpy は memcpy 関数呼び出しを発行するようにフォールバックできます。

この選択のロジックは何ですか? clang/llvm、intel c++ コンパイラ、PCC、suncc (oracle studio) など、他の gcc 互換コンパイラでもロジックは同じですか?

プレーンな memcpy よりも __builtin_memcpy を使用した方がよいのはいつですか?

4

1 に答える 1

20

しばらく前に組み込みの置換を試していたの<string.h>ですが、コンパイル時にソース引数のサイズを知ることができる場合にのみ関数が置換されることがわかりました。その場合、への呼び出しlibcは展開されたコードに直接置き換えられます。

-fno-builtin-ansi、または同様のものでコンパイルしない限り、プレフィックス-std=c89を使用するかどうかは実際には関係ありません。__builtin_

わかりにくいですが、ライブラリ呼び出しを発行するか、コードのチャンクを発行するかを決定するコードは、ここにあるようです。

于 2012-09-04T23:05:28.017 に答える