【发布时间】:2016-03-15 04:11:49
【问题描述】:
我有以下代码:
int main()
{
volatile char a;
return 0;
}
当我用arm-linux-gnueabihf-gcc -o align.txt -O0 -S align.c 反汇编它时,我得到以下信息:
push {r7}
sub sp, sp, #12
...
现在,我知道 ARM EABI 要求堆栈是 8 字节对齐的,这可以解释 gcc 分配的空间比a 所需的单个字节多一些。但是,我原以为它会分配 4 个字节来为 a 和 3 个填充字节腾出空间。
看起来它分配了 4 个字节以使推送的 r7 对齐,然后再分配 8 个字节(1 个用于 a,7 个用于填充)。如果我改为定义一个 9 成员 char 数组,它将分配 20 个字节。
为什么推送的 r7 需要自己的填充?
【问题讨论】:
-
愚蠢的问题,暗中刺探:如果您删除“易失性”,并使用
a,这样它就不会被编译掉,是一样的吗? -
请注意,当您不启用优化时,gcc 会做很多非常幼稚的事情。
-
是的,您应该使用
-O3,然后将return 0;更改为return a;,这样它就不会被优化掉。您将看到分配了 8 个字节。 -
@MarcusMüller 是的。我还尝试了 Jester 的建议,它只是编译为
movs r0, #0。通过优化,gcc 似乎变得更加智能。 -
-Os会发生什么?