33

http://en.cppreference.com/w/cpp/string/byte/memcpyによると、c++memcpyは宛先、ソース、およびサイズ/バイトの 3 つのパラメータを取ります。また、ポインタも返します。どうしてこんなことに?データを入力およびコピーするのに十分なパラメーターではありません。

または私は何かを誤解していますか?例では戻り値を使用していません

4

5 に答える 5

60

関数が返す特定のものを持たない場合、多くの場合、入力パラメーターの 1 つ (主要なものと見なされるもの) を返すのが通例です。これを行うと、式で「連鎖した」関数呼び出しを使用できます。たとえば、次のことができます。

char buffer[1024];
strcat(strcpy(buffer, "Hello"), " World");

具体的には、結果としてstrcpy元のdst値を返すためです。基本的に、そのような関数を設計するときは、「連鎖」に最も適したパラメーターを選択し、それを結果として返すことをお勧めします (繰り返しますが、他の方法で返すことに注意している場合、つまり、そうでない場合に関数が を返す場合void)。

好きな人もいれば、嫌いな人もいます。それは個人的な好みの問題です。memcpy別の例として、C 標準ライブラリはこの手法をサポートすることがよくあります。考えられるユースケースは、次のようなものかもしれません

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が、そのような厳格なルールは存在せず、これまでもありませんでした。そのため、ポインターを返すことは (そうであるように) どういうわけか「間違っている」または「悪い習慣」であるというよく言われる意見は、まったく根拠がありません。

于 2010-04-27T18:18:15.920 に答える
14

IIRC では、C の初期のバージョンではvoidリターンがありませんでした。そのため、十分に長い間使用されてきたライブラリ関数は、レガシーな理由で何かを返します。

string.h宛先パラメーターを返す関数がたくさんあります: memcpystrcpystrcat. あまり便利ではありませんが、害はありません (おそらく、多くの呼び出し規則では、実装するための命令さえ必要としません)。

Or somethingchar *nextbuf = memcpy(get_next_buf(), previous_buf+offset, previous_size-offset);の代わりにuse: を思い付くかもしれません。char *nextbuf = get_next_buf(); memcpy(nextbuf, etc);

比較のために、qsortvoid を返します。base「何かを返す、役に立つかもしれない」という原則に基づいて返すように定義できたかもしれませんが、そうではありませんでした。むしろ、イテレータを出力範囲の最後std::copyに返す方が便利です。呼び出し元が計算するのは簡単ではないか、可能でさえない可能性がある非ランダム アクセス イテレータの場合。

于 2010-04-27T18:07:14.807 に答える
1

値を返すことにより、memcpy 関数の呼び出しを右辺値として使用できます。

于 2010-04-27T18:01:11.473 に答える
0

使用していないことを示したい場合は、return を void にキャストできます。例:
(void) memcpy(mydest, mysrc, mybytes);

于 2010-04-27T18:36:47.123 に答える
0
void *memcpy(void* dest, const void* src, std::size_t count);
//returns void * which can be assigned to another void array that can be used as int or char data type.
void *ret = new int[6];
ret = memcpy(newarr, arr, sizeof(int)* 5);
于 2016-03-18T15:16:10.893 に答える