c ++ memcpy返回值

kni*_*ttl 31 c++ memcpy

根据http://en.cppreference.com/w/cpp/string/byte/memcpy,c ++ memcpy有三个参数:目标,源和大小/字节.它还返回一个指针.为什么会这样?不是足以输入和复制数据的参数.

还是我误解了什么?示例不使用返回值

AnT*_*AnT 54

如果函数没有特定的返回函数,通常会返回一个输入参数(一个被视为主要参数).这样做允许您在表达式中使用"链式"函数调用.例如,你可以做到

char buffer[1024];
strcat(strcpy(buffer, "Hello"), " World");
Run Code Online (Sandbox Code Playgroud)

特别是因为strcpy返回原始dst值作为结果.基本上,在设计这样的函数时,您可能希望为"链接"选择最合适的参数并将其作为结果返回(同样,如果您还要注意返回,即否则您的函数将返回void).

有些人喜欢它,有些人不喜欢.这是个人喜好的问题.C标准库通常支持这种技术,memcpy是另一个例子.一个可能的用例可能是类似的

char *clone_buffer(const char *buffer, size_t size)
{
   return memcpy(new char[size], buffer, size);
}
Run Code Online (Sandbox Code Playgroud)

如果memcpy没有返回目标缓冲区指针,我们可能必须实现上面的那样

char *clone_buffer(const char *buffer, size_t size)
{
   char *clone = new char[size];
   memcpy(clone, buffer, size);
   return clone;
}
Run Code Online (Sandbox Code Playgroud)

看起来"更长".这两种实现之间的效率没有任何差别.并且可以说哪个版本更具可读性.仍有许多人可能会欣赏"免费"机会来编写如上所述的第一个版本的简洁单行.

很多时候人们发现memcpy返回目标缓冲区指针会让人感到困惑,因为人们普遍认为从函数返回一个指针通常(或总是)指示该函数可能会分配/重新分配内存.虽然这可能确实表明了后者,但没有这样的硬规则,而且从来没有这样,所以经常表达的观点是,返回指针(如memcpy确实)在某种程度上是"错误的"或"不良实践"是完全没有根据的.


Ste*_*sop 11

IIRC,在C的早期版本中没有void回报.因此,由于遗留原因,已经存在很长时间的库函数会返回一些东西,这是他们想出的最好的.

有一组函数在string.h其返回目的地参数:memcpy,strcpy,strcat.它不是很有用,但它没有坏处(可能在许多调用约定中甚至不需要执行指令).

你可能会想到一个用途:char *nextbuf = memcpy(get_next_buf(), previous_buf+offset, previous_size-offset);而不是char *nextbuf = get_next_buf(); memcpy(nextbuf, etc);或者某种东西.

为了比较,qsort返回void.它可以被定义为返回base"返回某些东西,它可能派上用场"的原则,但事实并非如此.std::copy更有用的是将迭代器返回到输出范围的末尾.对于非随机访问迭代器,对于调用者来说,这些迭代器可能不是微不足道的,甚至是可能的.