簡體   English   中英

堆棧框架的大小總是固定的?

[英]size of a stack frame always fixed?

在C ++程序執行期間,特定函數的堆棧幀是否始終具有常量大小,或者在某些情況下允許編譯器執行動態堆棧管理,類似於alloca()函數的作用? 為了更好地描述它,我的意思是堆棧幀中特定局部變量或對象的偏移量可能在不同的函數執行時發生變化

至少在大多數典型的實現中,可變參數函數的堆棧幀根據傳遞的變量數而變化。 例如:

printf("%d", 1); // stack frame contains 1 pointer, one int
printf("%d %d", 1, 2); // stack frame contains one pointer, 2 ints.

實現是否與alloca特別相似取決於實現(特別是因為alloca不是標准的,所以如何或者甚至實現它可能會有所不同)。

允許編譯器按照自己的意願執行,畢竟它生成代碼,只要它執行C ++中的程序說它沒問題。 通常,只要有可能,編譯器就會計算函數所需的總堆棧空間並預先保留(減少堆棧寄存器寫入的次數),即使對象是按需創建和銷毀的。

該標准沒有說明任何內容(它甚至不需要你有一個堆棧),並且使用C ++ 14可能需要像alloca這樣的東西,因為它可能會獲得C99 VLA的“輕型”版本。

在通常的實現中,局部變量被放置在堆棧幀上。 某些函數可能具有由寄存器容納的變量,其他函數可能具有放置在堆棧上的變量。

堆棧幀也可以通過語句塊中聲明的非靜態變量進行擴展。

堆棧幀沒有標准的最小大小。 堆棧幀的最大大小取決於平台和實現。 一個常見的實現是讓堆棧向堆擴展,堆擴展到堆棧。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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