为什么gcc会为以下清除结构体的函数创建不同的汇编代码?
typedef struct {
char a;
int b;
} A;
void f(A *x) {
memset(x, 0, sizeof(*x));
}
void g(A *x) {
x->a = 0;
x->b = 0;
}
void h(A *x) {
*x = (A) {0};
}
汇编语言 (-Ofast
):
f:
mov QWORD PTR [rdi], 0
ret
g:
mov BYTE PTR [rdi], 0
mov DWORD PTR [rdi+4], 0
ret
h:
mov QWORD PTR [rdi], 0
ret
我猜测这是由于数据结构的填充所致,但是gcc不允许覆盖填充字节吗,因为它们无论如何都不会被使用?实际上,我期望 f
、g
和 h
会生成相同的代码。
谢谢