c ++ memcpy返回值

时间:2010-04-27 17:59:13

标签: c++ memcpy

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

或者我误解了什么?示例不使用返回值

5 个答案:

答案 0 :(得分:54)

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

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

具体是因为strcpy返回原始dst值作为结果。基本上,在设计这样的函数时,您可能希望为“链接”选择最合适的参数并将其作为结果返回(再次,如果您还有其他要返回的,即否则您的函数将返回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;
}

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

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

答案 1 :(得分:10)

IIRC,在C的早期版本中,没有void返回。因此,由于遗留原因,已经存在很长时间的库函数返回某些,这是他们能够提出的最好的。

string.h中有许多函数返回目标参数:memcpystrcpystrcat。它不是很有用,但它没有任何危害(可能在许多调用约定中甚至不需要执行指令)。

您可能会想到一个用途: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更有用的是将迭代器返回到输出范围的 end 。对于非随机访问迭代器,可能不是微不足道的,甚至可能是调用者计算的。

答案 2 :(得分:1)

通过返回一个值,可以将memcpy函数的调用用作r值。

答案 3 :(得分:0)

如果您想要表明您没有使用它,您可以将返回值转换为空格 - 例如:
(void) memcpy(mydest, mysrc, mybytes);

答案 4 :(得分: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);