我想知道将 n 个字节从 *source 复制到 *destination、when
*destination = *source + k
和k is netural or zero
.
memcpy() 函数具有未定义的重叠行为。
memmove() 函数不是最好的,因为它必须检查重叠的一面。
还有另一个最适合我的功能吗?
提前致谢!
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()
.所以我们被这两个函数困住了。)
memmove()
必须花一些时间来确定源和目标如何以及是否重叠,因此它可以决定复制数据的顺序。
假设,一个版本memmove()
省略了这个初始计算,或者因为它假设一个特定的方向,或者因为它有一个额外的参数可以让你告诉它,可能会比memmove()
.
但是标准库中没有这样的功能。
您可以编写自己的函数,但它不太可能像您的系统一样快memmove()
,这很可能会进行大量优化。您可以获取系统memmove()
功能的源代码副本(如果可用)并对其进行修改,但结果可能是不可移植的(memmove()
可能取决于运行它的系统的特性)。
但这不太可能值得付出努力。对于合理大小的移动,进行初始计算所花费的时间memmove()
可能只是复制数据所花费时间的一小部分。
除非您从实际测量中知道由 执行的初始计算会给您的程序memmove()
带来显着的性能损失,否则请使用它自己。memmove()