簡體   English   中英

C ++程序的最大堆棧級別是多少?

[英]What is the maximum stack level for a C++ program?

我試着看看在通過C ++中的遞歸獲得堆棧溢出之前我能走多遠。 我寫了這個函數

long recurse( long level ) {
    std::cout << level << std::endl;
    return recurse( ++level ) * 12 //to avoid tail recursion optimization, if present
}

我稱之為傳遞0作為第一個值。 它打印的最后一個數字是349411,然后它打印出Segmentation fault並停止運行。 我的猜測是內存不足,但是在Lua中拋出stack overflow錯誤之前,使用相同值調用的相同函數打印499982,如果Lua函數的內存權重比C ++函數小,我會感到驚訝。

那么C ++程序在停止執行之前可以獲得的最大堆棧級別是多少?

是真的“直到它有記憶”,還是有固定的限制?

另外為什么打印Segmentation fault

這是不是只在未經授權的方式訪問內存時打印的消息?

可用於遞歸的內存量取決於編譯器設置,操作系統和物理平台。 沒有最低限度或最高限額。

當內存不足時,可以打印各種錯誤,一條常見消息是“分段錯誤”。

另外為什么打印分段錯誤?

這是不是只在未經授權的方式訪問內存時打印的消息?

您的程序通過要求比可用內存更多的內存或訪問程序范圍(分配)之外的內存以未經授權的方式訪問內存,因此操作系統很好並且顯示了分段錯誤 您的操作系統可能已經破壞了您的計算機或掛起或重新啟動。 一些平台顯示藍屏死機

如果Lua函數的內存權重比C ++函數小,我會感到驚訝。

你假設Lua正在使用C ++堆棧來執行Lua函數調用。

事實並非如此。 Lua有自己的功能堆棧,有自己的限制。 就像Lua有自己的內存空間(由主機提供)等等。

C ++堆棧的局限性取決於實現,不能先驗地確定。

這是不是只在未經授權的方式訪問內存時打印的消息?

是。 那就是你做的。 您試圖訪問的堆棧空間比分配的數量多。 這是訪問您未被授權訪問的內存。

你問的是非常依賴於實現。 這有很多因素依賴於它,主要是編譯器可用的可用計算機內存,這在計算機之間差別很大。 當然,沒有單一的標准,但你目前得到的錯誤, Segmentation Fault ,是可能打印的許多錯誤之一。 有些編譯器甚至可以打印Stack Overflow

暫無
暫無

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

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