给出以下代码:
typedef struct tagRECT {
int left;
int top;
int right;
int bottom;
} RECT;
extern int Func(RECT *a, int b, char *c, int d, char e, long f, int g, int h, int i, int j);
int main() {
}
void gui() {
RECT x = {4, 5, 6, 7};
Func(&x, 1, 0, 3, 4, 5, 6, 7, 8, 9);
}
这是程序集生成的gcc x86_64,大概在Linux上(我使用
compiler explorer
)
main:
mov eax, 0
ret
gui:
push rbp
mov rbp, rsp
sub rsp, 16
; RECT x assignment
mov DWORD PTR [rbp-16], 4
mov DWORD PTR [rbp-12], 5
mov DWORD PTR [rbp-8], 6
mov DWORD PTR [rbp-4], 7
; parameters
lea rax, [rbp-16]
push 9
push 8
push 7
push 6
mov r9d, 5
mov r8d, 4
mov ecx, 3
mov edx, 0
mov esi, 1
mov rdi, rax
call Func
add rsp, 32
nop
leave
ret
可以看出
int
在结构中,按4个字节对齐。但是函数的最后4个参数
int
是
push
D到堆栈,这意味着它们被8个字节对齐。为什么不一致?