在C中的CHAR之后存储INT需要7个字节,而不是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都会与[ebp-1]中用于char的字节重叠。(

最新更新