例如给予
typedef struct A {
int a;
int b;
int c;
} A;
typedef struct B {
int d;
int e;
int f;
} B;
void f(B& b1, A& a2) {
b1.d = a2.a;
b1.e = a2.b;
b1.f = a2.c;
}
f
可以替换为 memcpy
(特别是如果结构有更多字段)。
两个版本会产生相同的代码吗?
如果我们复制到的结构的字段少于
A
怎么办?即typedef struct C { int g; int h; } C; void h(C& c1, A& a2) { c1.g = a2.a; c1.h = a2.b; }
我很感兴趣,因为我生成的代码包括这样的结构拷贝,通常会更改字段的顺序,我想知道是否应该对这些情况进行特殊处理。
包含 C 标记是因为我希望 C 中的行为是相同的(取模指针而不是引用)。
最佳答案
根据 godbolt.org,带有 -O2 的 x86-64 gcc 6.2 产生
mov eax, DWORD PTR [rsi]
mov DWORD PTR [rdi], eax
mov eax, DWORD PTR [rsi+4]
mov DWORD PTR [rdi+4], eax
mov eax, DWORD PTR [rsi+8]
mov DWORD PTR [rdi+8], eax
对于逐个字段的复制,
mov rax, QWORD PTR [rsi]
mov QWORD PTR [rdi], rax
mov eax, DWORD PTR [rsi+8]
mov DWORD PTR [rdi+8], eax
用于 memcpy
。 clang 和 icc 都有相似的区别。有点失望。
关于c++ - GCC 和 Clang 是否优化逐字段结构复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41061378/