簡體   English   中英

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     $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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM