我对使用 memmove() 有两个疑问:
我希望我能以一种好的方式解释我的怀疑。
编辑:我必须从数组中删除一个元素,然后我想在左侧移动已删除的元素的以下元素。
答案 0 :(得分:17)
memmove
可能会更快,但它可能永远不会慢于你自己的复制数据的功能(它通常用精心设计的程序集编码,以便以当前架构上最有效的方式移动东西); 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)
表示“获取数组元素的大小”)
答案 1 :(得分:5)
memmove
与memcpy
类似,但目标和源数组可以重叠。
使用memcpy
,您承诺区域不重叠,这允许实现执行一些额外的优化。因此memcpy
可能比memmove
更快。
memmove
函数采用void *
目标参数和const void *
源参数。这意味着您可以使用数组类型的destination和source参数调用该函数,因为它们将转换为指针类型。因为您可以将任何非限定对象指针类型分配给void *
或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);
现在使用memcpy
或memmove
通常比编写自己的函数更好。例如,在glibc中,根据MCU指令集和要复制的大小,memcpy
可以由编译器替换为memcpy
的一些快速内联汇编版本。
答案 2 :(得分:0)
何时最好使用此功能而不是使用其他功能(即创建自己的功能)
它比“创建自己的功能”更快。
函数的签名是void * memmove(void * dest,const void * src,size_t n)。如果我有一个简单的数组arr [N],我怎么能把它放到被调用的函数中? arr [N]或& arr [N]
只是arr
?