memcpy vs C中的赋值 - 应该是memmove吗?

bst*_*rre 9 c optimization gcc memcpy memmove

正如在这个问题的答案中指出的那样,编译器(在这种情况下是gcc-4.1.2,是的,它是旧的,我不能改变它)可以用它认为合适的memcpy替换结构赋值.

我正在valgrind下运行一些代码,并收到有关memcpy源/目标重叠的警告.当我查看代码时,我看到了这一点(释义):

struct outer
{
    struct inner i;
    // lots of other stuff
};

struct inner
{
    int x;
    // lots of other stuff
};

void frob(struct inner* i, struct outer* o)
{
    o->i = *i;
}

int main()
{
    struct outer o;

    // assign a bunch of fields in o->i...

    frob(&o.i, o);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果gcc决定用该替换该赋值memcpy,那么它是一个无效的调用,因为源和dest重叠.

显然,如果我改变赋值语句frob来调用memmove,那么问题就会消失.

但这是一个编译器错误,还是该赋值语句以某种方式无效?

Jen*_*edt 4

我认为你混淆了级别。gcc只要能够保证正确的行为,通过调用任何喜欢的库函数来替换赋值操作是完全正确的。

它不是memcpy标准意义上的“调用”或任何其他内容。它只是使用其库中的一个函数,该函数可能具有保证正确性的附加信息。memcpy标准中描述的属性被视为程序员的接口,而不是编译器/环境实现者的接口。

在该实现中是否memcpy实现了使其对赋值操作有效的行为是另一个问题。检查这一点甚至检查代码应该不那么困难。