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 编译。
在分析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 编译。