我想知道将 n 个字节从 *source 复制到 *destination 时最快的函数是什么
*destination = *source + k
,k 为中性或零
。
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()
之间的区别。然而,由于一些不幸的历史原因,C 标准库的作者并没有决定进行这种简化,所以我们只能使用这两个函数。)
关于c - 当我知道重叠的一面时,memmove() 的替代方案是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23122280/