簡體   English   中英

有沒有辦法在Visual Studio C ++中增加運行時的堆棧保留大小

[英]Is there any way to increase stack reserve size in running time in visual studio C++

我正在用C ++開發一個.exe求解器。 求解器中有一個遞歸算法,因此我在“配置屬性”->“鏈接器”->“系統”->“堆棧保留大小”中將堆棧保留大小設置為2 100 000 000。 但是,當一些客戶在他們的計算機上運行它時,它就會崩潰。 它在大多數機器上都能正常工作。 我將堆棧保留大小減小為0,並要求客戶嘗試。 有用。 所以我認為堆棧保留大小應該是問題。

現在我有兩個問題:

  1. 客戶機器的潛在問題是什么? 我認為客戶可能會設置很小的虛擬內存最大大小。 因此,我在計算機上進行了嘗試,在高級系統設置->性能設置->高級->虛擬內存->客戶大小中將虛擬內存的最大大小設置為0。 但是在這種情況下,求解器不會崩潰。

  2. 有什么方法可以在運行時設置堆棧保留大小。 如果可以,那么如果求解器崩潰,我可以讓客戶用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位。
  • 您的代碼在運行32位版本的Windows的計算機上始終崩潰。
  • 在運行64位Windows或帶有/3GB boot.ini選項的32位Windows的計算機上,您的代碼有時可以正常工作,但在啟動過程中經常會崩潰。

正如Cyber​​所說,您應該設計代碼以使用更少的堆棧空間。 Mats在回答中提供了一些實用的建議。

至於在運行時設置堆棧保留,是的,可以使用CreateThread的第二個參數。 基本上,您將主線程留有一個小的堆棧(例如,默認大小),然后以所需的大小調用CreateThread並執行新線程中的所有操作。 但是不要那樣做,而要解決可笑的高堆棧使用率。

暫無
暫無

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

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