簡體   English   中英

主函數堆棧大小

[英]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.

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