1

我想知道将 n 个字节从 *source 复制到 *destination、when *destination = *source + kk is netural or zero.

memcpy() 函数具有未定义的重叠行为。

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

还有另一个最适合我的功能吗?

提前致谢!

4

2 回答 2

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().所以我们被这两个函数困住了。)

于 2014-04-16T23:58:44.403 回答
2

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

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

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

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

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

除非您从实际测量中知道由 执行的初始计算会给您的程序memmove()带来显着的性能损失,否则请使用它自己。memmove()

于 2014-04-17T00:06:25.880 回答