复制到数组时的memcpy vs赋值; 为什么这会生成不同的代码?

Ant*_*lov 8 c++ optimization struct

编译以下代码时

#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));
}
Run Code Online (Sandbox Code Playgroud)

GCC和clang都发出一系列movb指令copy_assignment,同时发出一条movl指令copy_memcpy.假设X没有填充,它不在这里,不应该两个是等效的,并且不是单个movl更有效?

确切地说,我正在编译:

g++ -O3 -S -o prog.S prog.cpp
Run Code Online (Sandbox Code Playgroud)

为了铿锵而战.GCC版本为7.1.1,Clang版本为4.0.1.使用-O2,-Os和-Ofast会得到相同的结果.

Bo *_*o R 1

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