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

标签 c memcpy memmove

我想知道将 n 个字节从 *source 复制到 *destination 时最快的函数是什么 *destination = *source + kk 为中性或零

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/

相关文章:

通过 memcpy 将数据从用户应用程序复制到内核驱动程序

c - memmove 和 memcpy 有什么区别?

c - 有没有更好的插入排序方法?

c - memcpy 的内部实现是如何工作的?

c++ - 使用 malloc : why did it happen? 的内存分配导致堆损坏

c - 在 Atmega 的 I2C 接口(interface)中没有得到正确的值

c - 为什么不同类型的符号占用相同的长度?

c - 多项式插值中的段错误

c - 哪里可以找到timespec_get的源代码?