您的位置:首页 > 编程语言 > C语言/C++

探究 Windows 下编译的栈空间 以及 DEV C++工具栈空间的调整(设置)

2015-12-15 17:41 661 查看
关于堆栈的一些认识:

程序中变量的定义不是分配在堆上,就是在栈上。今天看了几篇讨论堆和栈的文章,里面讲到栈的默认大小可能是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++ 语法界面显示设置

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: