によるとhttp://en.cppreference.com/w/cpp/string/byte/memcpyC++ はmemcpy
、宛先、ソース、サイズ/バイトの 3 つのパラメータを取ります。また、ポインタも返します。
void* memcpy( void* dest, const void* src, std::size_t count );
それはなぜですか? パラメータだけでデータを入力してコピーするだけでは不十分ですか?
何か誤解しているのでしょうか? 例では戻り値は使用されていません。
ベストアンサー1
関数が返す値が特にない場合は、入力パラメータの1つ(主要なこうすることで、式の中で「連鎖」関数呼び出しが使えるようになります。例えば、
char buffer[1024];
strcat(strcpy(buffer, "Hello"), " World");
特に、 は結果としてstrcpy
元のdst
値を返すためです。基本的に、このような関数を設計するときは、「連鎖」に最も適切なパラメータを選択し、それを結果として返す必要があります (この場合も、返す else がない場合、つまり、それ以外の場合は関数が を返す場合void
)。
好きな人もいれば、嫌いな人もいます。これは個人の好みの問題です。C標準ライブラリは、このテクニックをサポートすることがよくあります。これmemcpy
は別の例です。考えられる使用例は、次のようなものかもしれません。
char *clone_buffer(const char *buffer, size_t size)
{
return memcpy(new char[size], buffer, size);
}
memcpy
宛先バッファポインタを返さない場合は、おそらく上記のように実装する必要があるでしょう。
char *clone_buffer(const char *buffer, size_t size)
{
char *clone = new char[size];
memcpy(clone, buffer, size);
return clone;
}
これは「長く」見えます。これら 2 つの実装に効率の差がある理由はありません。また、どちらのバージョンがより読みやすいかは議論の余地があります。それでも、上記の最初のバージョンのような簡潔なワンライナーを「無料で」書く機会を喜ぶ人は多いでしょう。
多くの場合、memcpy
関数からポインタを返すことは、通常(または常に)関数がメモリを割り当て/再割り当てする可能性があることを示しているという一般的な考えがあるため、宛先バッファポインタを返すことに混乱を感じる人がいます。かもしれない確かに後者を示していますが、そのような厳格なルールは存在せず、これまでも存在したことがないので、ポインタを返すこと (のようにmemcpy
) が何らかの形で「間違っている」または「悪い習慣」であるというよく表明される意見はまったく根拠がありません。