在 C 中的 CHAR 之后存储 INT 需要 7 个字节而不是 4 个字节

Storing INT after CHAR in C requires 7 bytes instead of 4

我正在查看以下 C 代码段:

char x = 'a';
int y = 5;

在 运行 gdb 之后我遇到了以下程序集:

mov BYTE PTR [ebp-1], 0x61
mov DWORD PTR [ebp-8], 0x5

为什么 ebp 减少了 7 而不是 4?如果我用 int x = 2 替换 char x = 'a',我看不到这种行为。

在您的 C 实现中,int 对象必须存储在四的倍数的地址,通常是由于硬件对齐要求或功能。 EBP 寄存器中的地址已知是 4 的倍数(可能是 16 的倍数,具体取决于您的 C 实现)。所以 [ebp-5] 不会是四个字节的倍数,[ebp-6][ebp-7] 也不会。编译器必须转到 [ebp-8] 才能得到下一个四的倍数。

([ebp-2][ebp-3][ebp-4] 不被考虑,因为在任何这些地址处开始一个四字节 int 会与 [= 中的字节重叠19=] 用于 char.)