[英]main function stack size
最大函數堆棧的大小是有限的,如果我們使用較大的堆棧變量或對遞歸函數粗心大意,則可以很快將其耗盡。
但是main的堆棧並不是真正的堆棧。 main始終只被調用一次,而不會被遞歸調用。 無論如何,main的堆棧是一開始就分配的靜態存儲,並且一直存在到最后。 這是否意味着我可以在main的堆棧中分配大數組?
int main()
{
double a[5000000];
}
它是100%與編譯器和系統相關的,就像大多數此類有趣的業務一樣。 哎呀,即使標准沒有規定堆棧的存在 。
實際上,是的,它在堆棧上,不,您不能在堆棧上分配類似的東西而不會遇到麻煩。
main
只是一個正常功能。 堆棧大小取決於系統。
Alos記住,對於所有函數調用,您的進程僅共享一個堆棧。 項目被main
調用並從堆棧中彈出。
它是實現定義的(語言標准不討論堆棧,即AFAIK)。 但是通常, main
生命就像其他函數一樣生活在堆棧中。
當您以這種方式分配數組時,它將在堆棧上分配。 堆棧可以增長到與平台相關的最大大小。 是的,您已經超越了它。
我想起了第二個想法-可以遞歸調用它。 查看以下混淆代碼:
http://en.wikipedia.org/wiki/Obfuscated_code
它調用了很多次並產生了奇跡:)無論如何,這是一個有趣的鏈接。 因此,肯定分配了堆棧,對此感到抱歉!
堆棧是所有函數都使用的東西-您表達問題的方式表明,每個函數都被賦予了一個堆棧,事實並非如此。
每次使用函數調用時,堆棧使用量都會增加-main main()
是第一個。 在示例中使用的分配與在另一個函數中進行堆棧分配一樣糟糕。
對於大多數現代系統,沒有真正的理由需要限制堆棧大小。 您可能可以調整操作系統參數,該程序將正常運行。 (與在棧上分配相等數量的數據(無論是否main
)的任何對象一樣)。
但是,如果您確實希望對象的生存期等於程序的持續時間,請創建一個全局變量而不是main
內部的局部變量。 大多數平台不會人為地限制全局對象的大小,它們通常可以達到內存映射允許的大小。
順便說一句, main
在C ++程序期間不處於活動狀態。 在構造全局對象之前,可能要先銷毀相同的對象和atexit
處理程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.