探究 Windows 下编译的栈空间 以及 DEV C++工具栈空间的调整(设置)
2015-12-15 17:41
661 查看
关于堆栈的一些认识:
程序中变量的定义不是分配在堆上,就是在栈上。今天看了几篇讨论堆和栈的文章,里面讲到栈的默认大小可能是1m,也可能是2m,好奇之下试试。
大概就是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
输出:
a
代码2:
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++ 语法界面显示设置
程序中变量的定义不是分配在堆上,就是在栈上。今天看了几篇讨论堆和栈的文章,里面讲到栈的默认大小可能是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++ 语法界面显示设置
相关文章推荐
- C++嵌入Python,以及两者混用
- C++构造函数详解及显式调用构造函数
- C++解决error C4996报错
- C++可变参数函数( 如:void Func(int a, int b, ...) )用法
- C语言申明1000000以上数组的方法
- C语言学习笔记(六)字符串
- C++ 重载 重写
- 单片机C语言中while(1)的问题
- C语言基础 之 switch-case语句
- C++工程编译之“error LNK2001: 无法解析的外部符号”
- C++/Qt 序列化操作
- C++/Qt 序列化操作
- C语言getopt()函数的使用
- C++11: smart pointer
- c++实现半同步半异步I/O的设计模式(half sync/half async)
- 红黑树插入算法(C++)
- C++ operator关键字(重载操作符)
- C++ mfc 之 CTreeCtrl
- C语言-07其它相关
- C语言-06数据类型-05 总结