在分析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
答案 0 :(得分:-1)
作为评论中提到的EOF,这是由于堆栈对齐,可以通过设置选项-mpreferred-stack-boundary
进行更改。归功于这个答案https://stackoverflow.com/a/1061942/696110
提到的选项也会影响C编译。