复制成数组时的memcpy vs分配;为什么这会生成不同的代码



编译以下代码时,

#include <cstring>
struct X { char a, b, c, d; };
void copy_assignment(char* p, X x) {
    *p++ = x.a;
    *p++ = x.b;
    *p++ = x.c;
    *p++ = x.d;
}
void copy_memcpy(char* p, X x) {
    memcpy(p, &x, sizeof(X));
}

GCC和Clang均给copy_assignment发出一系列MOVB指令,同时为copy_memcpy发出单个MOVL指令。假设X没有填充物,它在这里不在,这两个都不应该等效,并且不是一个更有效的填充物吗?

确切地说,我正在编译:

g++ -O3 -S -o prog.S prog.cpp

和clang的同上。GCC版本为7.1.1,Clang版本为4.0.1。使用-o2,-os和-ofast给出相同的结果。

答案不一定是。正如您所说,编译器和版本之间的区别可能保持不变。但是查看GCC的中继版本的答案是输出与编译器资源管理器中看到的相同。

最新更新