我想知道从* source到* destination的复制n个字节的最快功能是什么时候
*destination = *source + k
和k is netural or zero
。
memcpy()函数具有重叠的unfind行为。
memmove()函数不是最好的,因为它必须检查重叠的一面。
还有另一个对我来说最佳的功能吗?
提前致谢!
答案 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()
本身。