[英]Is there any way to increase stack reserve size in running time in visual studio C++
我正在用C ++開發一個.exe求解器。 求解器中有一個遞歸算法,因此我在“配置屬性”->“鏈接器”->“系統”->“堆棧保留大小”中將堆棧保留大小設置為2 100 000 000。 但是,當一些客戶在他們的計算機上運行它時,它就會崩潰。 它在大多數機器上都能正常工作。 我將堆棧保留大小減小為0,並要求客戶嘗試。 有用。 所以我認為堆棧保留大小應該是問題。
現在我有兩個問題:
客戶機器的潛在問題是什么? 我認為客戶可能會設置很小的虛擬內存最大大小。 因此,我在計算機上進行了嘗試,在高級系統設置->性能設置->高級->虛擬內存->客戶大小中將虛擬內存的最大大小設置為0。 但是在這種情況下,求解器不會崩潰。
有什么方法可以在運行時設置堆棧保留大小。 如果可以,那么如果求解器崩潰,我可以讓客戶用ENV覆蓋堆棧大小。
PS:添加更多信息。 此代碼被編譯為64位,沒有設置LARGEADDRESSAWARE選項(我不知道此選項的默認設置)。 此代碼在64位計算機上幾乎可以很好地工作。 實際上,在過去幾年中,只有一位客戶抱怨飛機墜毀。
將堆棧大小設置為2GB是解決此問題的荒謬解決方案。 正確的解決方案是減少遞歸算法中的堆棧使用量,或使用迭代解決方案(可能使用軟件堆棧來解決遞歸為您解決的“我們回到哪里”問題)。
一個相對簡單的解決方案是使用std::vector<T> v(size);
而不知道代碼實際做什么std::vector<T> v(size);
而不是T v[size];
-這將使v
的大小約為3 *指針的大小,而不是堆棧上的sizeof(T) * size
-如果您有一些更大的數組,這實際上是減少堆棧使用率的有用方法。
崩潰的原因是,操作系統加載程序在嘗試為新進程設置初始線程時,未能找到2.1GB的連續地址空間來為線程堆棧分配(保留,而不是提交)。
此故障是不確定的,因為地址空間布局隨機化(一種安全功能)會導致DLL在隨機地址處加載,並且這會導致地址空間碎片化。 幸運的是,有一個足以容納線程堆棧的片段。 否則,在執行任何代碼之前立即崩潰。
更改虛擬內存設置無關緊要,因為問題在於地址空間,而不是所有進程中的最大虛擬內存總量。
根據您的描述,我的水晶球顯示:
/LARGEADDRESSAWARE
選項編譯為32位。 /3GB
boot.ini選項的32位Windows的計算機上,您的代碼有時可以正常工作,但在啟動過程中經常會崩潰。 正如Cyber所說,您應該設計代碼以使用更少的堆棧空間。 Mats在回答中提供了一些實用的建議。
至於在運行時設置堆棧保留,是的,可以使用CreateThread
的第二個參數。 基本上,您將主線程留有一個小的堆棧(例如,默認大小),然后以所需的大小調用CreateThread
並執行新線程中的所有操作。 但是不要那樣做,而要解決可笑的高堆棧使用率。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.