探究 Windows 下編譯的棧空間 以及 DEV C++工具棧空間的調整(設置)

關於堆棧的一些認識:

程序中變量的定義不是分配在堆上,就是在棧上。今天看了幾篇討論堆和棧的文章,裏面講到棧的默認大小可能是1m,也可能是2m,好奇之下試試。

int main (int argc, char *argv[])
{
        int tmp[600000] = {0};    tmp[1000]=100;  printf("%d",tmp[1000]);
}

大概就是2.1MB吧,出現了 [main] Test 3204 handle_exceptions: Exception: STATUS_STACK_OVERFLOW 28408 [main] Test 3204 open_stackdumpfile: Dumping stack trace to Test.exe.stackdump

代碼1

#include <iostream>
#include <stdlib.h>
 
using namespace std;
 
#define MinSize 1978*1024*1024/1000 
#define MaxSize 1979*1024*1024/1000 
 
#define StackSize MinSize

int main(int argc, char *argv[])
{
  //char tmp[2083440] = {0};
  char tmp[StackSize] = {0};
  //tmp[2083440-1]='a';
  tmp[StackSize-1] = 'a';
  printf("%c\n",tmp[StackSize-1]);
  return 0;
}

輸出:
a

代碼2:

#include <iostream>
#include <stdlib.h>
 
using namespace std;
 
#define MinSize 1978*1024*1024/1000 
#define MaxSize 1979*1024*1024/1000 
 
#define StackSize MaxSize
 
int main(int argc, char *argv[])
{
  //char tmp[2083440] = {0};
  char tmp[StackSize] = {0};
  //tmp[2083440-1]='a';
  tmp[StackSize-1] = 'a';
  printf("%c\n",tmp[StackSize-1]);
  return 0;
}

main返回不正常的值,出錯退出,無輸出。
PS:
由是觀之,Dev C++ 在 Windows上, 至少控制檯程序,的堆棧大小是2M(可存放最多1.978M ~1.979M之間的數據)
不過你那種,只定義,不使用的方法,是不能測試出什麼的。


DEV C++ 如何調整棧空間的大小

在研究裝箱問題的精確搜索算法。寫了一個迭代加深搜索,發現自己的程序運行大規模數據的時候總會出現一些莫名其妙的錯誤,分析之後發現是棧空間不夠。按道理說該問題的深度優先搜索算法的空間複雜度應該是O(n·f(n)),其中n是問題規模,表示當前找到一條從根節點到解的長度爲n的路徑,f(n)是一個關於n的多項式函數,表示每個節點使用的數組的大小,應該不容易溢出纔對。

之前網上的文章多數是傳授如何在VC下更改棧空間,而我使用的編譯器是GCC,相關文章很少。搜索一番以後得出如下結果
以下摘自 https://gcc.gnu.org/onlinedocs/gcc-4.0.1/gnat_ugn_unw/Setting-Stack-Size-from-gnatlink.html

"Under Windows systems, it is possible to specify the program stack size from gnatlink using either:

using -Xlinker linker option
          $ gnatlink hello -Xlinker --stack=0x10000,0x1000
This sets the stack reserve size to 0x10000 bytes and the stack commit size to 0x1000 bytes.
using -Wl linker option
          $ gnatlink hello -Wl,--stack=0x1000000
This sets the stack reserve size to 0x1000000 bytes. Note that with -Wl option it is not possible to set the stack commit size because the coma is a separator for this option."

總結一下,就是在調用連接器(linker)的時候加上運行參數
-Wl,--stack=SIZE_STACK(16M設置爲16777216)
其中SIZE_STACK是待設定的棧空間大小,如果用DEV-C++的話可以在“編譯器設置”欄中設定。需要注意的一點是,設置比較大的棧空間的時候需要使用64位位寬(mx)編譯程序,在DEV-C++的編譯器設置欄目中仍然可以找到。

後記

在代碼裏寫linker選項的方法也不行(其實和項目屬性設置是同一個東西吧)
#pragma comment(linker, "/STACK:16777216")


附上 DEV C++ 語法界面顯示設置





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章