g++ 在堆栈上分配未使用的内存是什么?

What does g++ allocate unused memory on the stack?

在分析g++ 5.2.0生成的二进制代码时,我发现编译器经常分配似乎没有被任何程序元素使用的内存。下面是一个例子。

源代码是

void
cxx_pretty_printer::declarator (tree t)
{
  this->direct_declarator (t); // A virtual function call
}

和生成的二进制文件

0x8427ce8   _ZN18cxx_pretty_printer10declaratorEP9tree_node:
0x8427ce8   push    %ebp
0x8427ce9   mov     %esp, %ebp
0x8427ceb   sub     [=11=]x8, %esp
0x8427cee   mov     0x8(%ebp), %eax
0x8427cf1   mov     0x0(%eax), %eax
0x8427cf3   add     [=11=]x4c, %eax
0x8427cf6   mov     0x0(%eax), %eax
0x8427cf8   sub     [=11=]x8, %esp
0x8427cfb   pushl   0xc(%ebp)
0x8427cfe   pushl   0x8(%ebp)
0x8427d01   call    *0x0(%eax,0)
0x8427d03   add     [=11=]x10, %esp
0x8427d06   nop 
0x8427d07   leave   
0x8427d08   ret 

不太明白为什么0x8427ceb和0x8427cf8处的代码应该存在。编译器减少堆栈寄存器,在我看来,它正在堆栈上分配一些 space 。然而,这个 space 从来没有被任何东西使用过。

是否有任何特殊原因使 g++ 这样做?我使用的选项是

-O2 -fno-exceptions -fno-rtti -fasynchronous-unwind-tables

正如评论中提到的 EOF,这是由于堆栈对齐,并且可以通过设置选项 -mpreferred-stack-boundary 来更改。归功于这个答案

提到的选项也会影响 C 编译。