[英]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 $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
正如評論中提到的EOF一樣,這是由於堆棧對齊所致,可以通過設置選項-mpreferred-stack-boundary
進行更改。 功勞歸功於這個答案https://stackoverflow.com/a/1061942/696110
提到的選項也影響C編譯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.