当我知道重叠的一面时,memmove()替代方案是什么?

时间:2014-04-16 23:55:52

标签: c memcpy memmove

我想知道从* source到* destination的复制n个字节的最快功能是什么时候 *destination = *source + kk is netural or zero

memcpy()函数具有重叠的unfind行为。

memmove()函数不是最好的,因为它必须检查重叠的一面。

还有另一个对我来说最佳的功能吗?

提前致谢!

2 个答案:

答案 0 :(得分:3)

memmove()没问题。它将通过比较两个指针来确定移动的方向 - 实现可能看起来像:

void * memmove(void *dst, const void *src, size_t len)
{
    intptr_t dsti = dst;
    intptr_t srci = src;
    if (src > dst) {
        return _memmove_up(dst, src, len);
    } else {
        return _memmove_down(dst, src, len);
    }
 }

在大多数CPU上,这将编译成可能有六个额外的指令,这些指令只在调用函数时执行一次 - 绕过它没有任何好处。

(理论上,memcpy()没有理由不能进行类似的比较来消除它与memmove()之间的区别。但是,出于某些不幸的历史原因,作者C标准库没有决定进行这种简化,所以我们坚持使用这两个函数。)

答案 1 :(得分:3)

memmove()必须花一些时间来确定源和目标的重叠方式以及是否重叠,因此它可以决定复制数据的顺序。

假设,memmove()的一个版本省略了这个初始计算,因为它假设一个特定的方向,或者因为它有一个额外的参数让你告诉它,可能比memmove()快一点

但标准库中没有这样的功能。

您可以编写自己的功能,但它不太可能像您的系统memmove()一样快,这很可能会被大量优化。您可以获取系统memmove()功能(,如果可用)的源代码副本并对其进行修改,但结果可能是非便携式(memmove()可能取决于它运行的系统的特性)。

但它不太可能值得付出努力。对于合理大小的移动,memmove()花费在初始计算上的时间可能只是复制数据所花费时间的一小部分。

除非您知道来自实际测量memmove()执行的初始计算会对您的程序带来显着的性能损失,否则只需使用memmove()本身。