14

我对使用memmove()有两个疑问:

  • 什么时候最好使用这个函数而不是使用另一个函数(即创建自己的函数)?我不确定我是否理解正确。
  • 该函数的签名是void *memmove(void *dest, const void *src, size_t n)。如果我有一个简单的数组arr[N],我怎样才能将它放入被调用的函数中?arr[N] 还是 &arr[N]?不同之处在于数组是用初始大小声明的还是像指针一样声明?我有这个疑问,因为我看到了很多同时使用两者的例子。

我希望我能很好地解释我的疑问。

编辑:我必须从数组中删除一个元素,然后我想在左边移动已删除元素的以下元素。

4

3 回答 3

20
  1. memmove可能更快,但它可能永远不会比您自己的复制数据的函数慢(它通常以精心设计的程序集编码,以在当前架构上以最有效的方式移动内容);
  2. 这取决于你想用那个数组做什么......如果你想将它的内容复制到另一个数组arr就足够了(并且,作为长度参数,你应该这样做sizeof(*arr)*N,其中 N 是要复制的元素数)。

顺便说一句,如果源和目标以及副本不重叠,memcpy可能会更快。

我想从数组中删除一个元素并将同一个数组的元素左移。

int arr[N];
/* ... */
/* Let's say you want to remove the element i (error checking on i omitted) */
memmove(arr+i, arr+i+1, (N-i-1)*sizeof(*arr));
/* or, if you prefer array indexing over pointer arithmetics: */
memmove(&arr[i], &arr[i+1], (N-i-1)*sizeof(*arr));

sizeof(*arr)意思是“获取数组元素的大小”)

于 2012-01-28T00:19:41.873 回答
8

memmove就像memcpy除了目标和源数组可以重叠。

memcpy您保证区域不重叠,这允许实现执行一些额外的优化。所以memcpy可以比memmove.

memmove函数接受一个void *目标参数和一个const void *源参数。这意味着您可以使用数组类型的目标和源参数调用函数,因为它们将被转换为指针类型。而且由于您可以将任何非限定对象指针类型分配给void *or const void *,因此在调用该函数时不需要任何强制转换。

char src[1024] = {0};
char dst[1024];

memmove(dst, src, sizeof dst);
/* src and dst don't overlap you should choose memcpy instead */
memcpy(dst, src, sizeof dst);

现在通常使用memcpymemmove比编写自己的函数更好。例如,在 glibc 中,根据 MCU 指令集和要复制的大小,memcpy编译器可以用一些快速内联汇编版本的memcpy.

于 2012-01-28T00:20:13.363 回答
0

什么时候最好使用这个函数而不是使用另一个函数(即创建自己的函数)

它比“创建自己的功能”更快。

函数的签名是 void *memmove(void *dest, const void *src, size_t n)。如果我有一个简单的数组 arr[N],如何将它放入被调用的函数中?arr[N] 或 &arr[N]

只是arr

于 2012-01-28T00:19:45.340 回答