memcpy を使用して、可変サイズのデータと固定サイズのデータの両方をコピーします。場合によっては、少量のメモリ (ほんの数バイト) をコピーします。GCCでは、memcpyが組み込み/組み込みであったことを思い出します。ただし、(valgrind を使用して) コードをプロファイリングすると、glibc で実際の「memcpy」関数が何千回も呼び出されます。
組み込み関数を使用するには、どのような条件を満たす必要がありますか? 私は自分の memcpy をすばやくロールバックできますが、ビルトインは私ができることよりも効率的であると確信しています。
注: ほとんどの場合、コピーされるデータの量は、コンパイル時の定数として利用できます。
CXXFLAGS: -O3 -DNDEBUG
私が現在使用しているコードでは、ビルトインを強制しています。_ builtinプレフィックスを外すと、ビルトインは使用されません。これは、T=sizeof(type) を使用して他のさまざまなテンプレート/関数から呼び出されます。使用されるサイズは、1、2、4 の倍数、いくつかの 50 ~ 100 バイト サイズ、およびいくつかのより大きな構造です。
template<int T>
inline void load_binary_fixm(void *address)
{
if( (at + T) > len )
stream_error();
__builtin_memcpy( address, data + at, T );
at += T;
}