如何使用和何时使用memmove在C?

时间:2012-01-28 00:15:40

标签: c function memmove

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

  • 何时最好使用此功能而不是使用其他功能(即创建自己的功能)?我不确定我是否理解得当。
  • 该函数的签名是 void * memmove(void * dest,const void * src,size_t n)。如果我有一个简单的数组 arr [N] ,我如何将它放入被调用的函数中? arr [N]或& arr [N]?不同之处在于,数组是以初始大小声明还是像指针一样?我有这个疑问,因为我看到很多例子都用在哪里。

我希望我能以一种好的方式解释我的怀疑。

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

3 个答案:

答案 0 :(得分:17)

  1. memmove可能会更快,但它可能永远不会慢于你自己的复制数据的功能(它通常用精心设计的程序集编码,以便以当前架构上最有效的方式移动东西);
  2. 这取决于你想对该数组做什么...如果你想将其内容复制到另一个数组arr就足够了(并且,作为长度参数,你应该sizeof(*arr)*N其中N是要复制的元素数量。)
  3. 顺便说一句,如果源和目标以及副本不重叠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)

memmovememcpy类似,但目标和源数组可以重叠。

使用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);

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

答案 2 :(得分:0)

  

何时最好使用此功能而不是使用其他功能(即创建自己的功能)

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

  

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

只是arr