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

时间:2015-11-04 20:43:24

标签: c++ compilation g++

在分析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     $0x8, %esp
0x8427cee   mov     0x8(%ebp), %eax
0x8427cf1   mov     0x0(%eax), %eax
0x8427cf3   add     $0x4c, %eax
0x8427cf6   mov     0x0(%eax), %eax
0x8427cf8   sub     $0x8, %esp
0x8427cfb   pushl   0xc(%ebp)
0x8427cfe   pushl   0x8(%ebp)
0x8427d01   call    *0x0(%eax,0)
0x8427d03   add     $0x10, %esp
0x8427d06   nop 
0x8427d07   leave   
0x8427d08   ret 

我不太明白为什么0x8427ceb和0x8427cf8的代码应该存在。编译器减少了堆栈寄存器,在我看来它正在堆栈上分配一些空间。但是,任何东西都不会使用这个空间。

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

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

1 个答案:

答案 0 :(得分:-1)

作为评论中提到的EOF,这是由于堆栈对齐,可以通过设置选项-mpreferred-stack-boundary进行更改。归功于这个答案https://stackoverflow.com/a/1061942/696110

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