为什么Linux memmove()以它的方式实现?

时间:2012-11-12 07:09:26

标签: c implementation memmove

来自memmove(3)

的Linux联机帮助页
  

memmove()函数将n个字节从内存区域src复制到内存区域dest。   存储区可能重叠:复制发生就好像src中的字节一样   首先复制到一个不与src或dest重叠的临时数组中   然后将字节从临时数组复制到dest。

不是分配临时数组并将值复制两次,我们可以执行以下操作:

void *my_memmove(void *dest, const void *src, size_t n) {
  signed char operation;
  size_t end;
  size_t current;

  if(dest != src) {
    if(dest < src) {
      operation = 1;
      current = 0;
      end = n;
    } else {
      operation = -1;
      current = n - 1;
      end = -1;
    }

    for( ; current != end; current += operation) {
      *(((unsigned char*)dest) + current) = *(((unsigned char*)src) + current);
    }
  }
  return dest;
}

在这个实现中,我们只关注我们开始复制的位置。

我的实施有缺点吗?

注意:我实际上不会使用我的实现。我很好奇。

1 个答案:

答案 0 :(得分:26)

您可以查看memmove herehereherehere的一些源代码。

你会注意到他们实际制作一个临时数组。编写手册页是为了帮助您了解它在做什么逻辑,而不是实际。因此,他们说“好像”。

memmove()实际上做的是将字节从src复制到dest,如果dest < src(与memcpy基本相同)则向前复制,否则向后复制

memcpymemmove之间的区别在于memcpy盲目地向前复制 - 这就是为什么destsrc不应重叠的原因。但memmove采取预防措施,确保重叠不会搞砸最终结果。