vc vs2010 堆栈栈最大是多少

vs2010设置堆栈大小 -
vs2010设置堆栈大小
在解释原因前我们先看一下一个由C/C++编译的程序占用的内存分为几个部分:
1、栈区(stack segment):由编译器自动分配释放,存放函数的参数的值,局部变量的值等。在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
2、堆区(heap segment)&: 一般由程序员分配释放,若程序员不释放,程序结束时可能由系统回收 。它与数据结构中的堆是两回事。堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
3、全局区(静态区)(data segment):全局变量和静态变量的存储区域是在一起的,程序结束后由系统释放。数据区的大小由系统限定,一般很大。
4、文字常量区:常量字符串就是放在这里的, 程序结束后由系统释放。
5、程序代码区:存放函数体的二进制代码。
综上所述,局部变量空间是很小的,我们开一个a[1000000]就会导致栈溢出;而全局变量空间在Win 32bit 下可以达到4GB,因此不会溢出。
VC6.0中修改堆栈大小的方法:
&1). 选择 &Project-&Setting&.
&2). 选择 &Link&.
&3. 选择 &Category&中的 &Output&.
&4. 在 &Stack allocations&中的&Reserve:&中输栈的大小,例如: 32768
在VS2010中设置堆栈大小的方法为:
1). 选择 &项目-&属性&.
2). 选择 &链接器&.
3. 选择 &系统&.
4. 在 &堆栈保留大小&中输栈的大小,例如: 32768 。
参考文献:
1./blog/variable-overflow-static.html
2.http://blog.csdn.net/liuhuiyi/article/details/8207021
更多相关文章
昨天在做小猪登山的题目碰到了数组容量太大的问题,今天做一个总结.
首先,参考了Slyar的文章&C语言 全局变量和局部变量的大小限制&直接贴上. #include &stdio.h& int main(){ int a[1000000];//局部变 ...
pthread_create 创建线程时,若不指定分配堆栈大小,系统会分配默认值,查看默认值方法如下: # ulimit -s 8192 # 上述表示为8M:单位为KB. 也可以通过# ulimit -a 其中 stack size 项也表示堆栈大小.ulimit -s
value 用来重新设置s ...
jvm堆栈大小的设置是在catalina.bat文件中 echo Using CATALINA_BASE: %CATALINA_BASE% echo Using CATALINA_HOME: %CATALINA_HOME% echo Using CATALINA_TMPDIR: %CATALINA_ ...
我的机器配置为 EGHz,2GB内存,Netbeans 6.5,NetBeans自带的Tomcat6.0.18.报表程序需要生成excel文件,记录数为2万条左右,最后生成的excel文件约10M,在netbeans里调试,报错:Java heap space.根据网上的资料,我调整 ...
VC++堆栈默认大小是1M,如果你分配大于1M的堆,一般会出异常,这里你要把堆调大些,下面是VC++6.0与VC++2010的设置方法 VC++6.0: 工程==&设置==&&连接&界面,如下图: 其中Reserve栏后的进六进制数就是堆栈大小. VC++2010:
插入索引和目录的一个前提是,在文章中一定要把文章中将来要做目录的标题部分设置为标题格式. 一般在格式工具栏(样式和格式),有文章内格式的设置,通常都是&正文&,你要做的就是根据文章的标题分级,把你 ...
/file/dii51oxc#12.剑走偏锋敢不敢,暴利引发的疯狂.rar/file/czzxsqc4#11.亏本,但赚钱?话费带动软件月入2万!.rarhtt ...
&!DOCTYPE html PUBLIC &-//W3C//DTD XHTML 1.0 Transitional//EN& &http://www.w3.org/TR/xhtml ...
故障:运行---&开始--&ping,提示&请选择用何种软件打开& 排障: -1)感觉是文件关联出了问题,参考网上教材修改path变量,无效! -2)最后全盘搜索,发现Document ...
什么是纵深防御: 纵深防御体系被认为是一种最佳安全做法.这种方法就是在网络中的多个点使用多种安全技术,从而减少攻击者利用关键业务资源或信息泄露到企业外部的总体可能性.在消息传递和协作环境中,纵深防御体系可以帮助管理员 ...
友情链接:
管理员邮箱:info@2003年9月 C/C++大版内专家分月排行榜第二2002年6月 C/C++大版内专家分月排行榜第二2002年4月 C/C++大版内专家分月排行榜第二
2007年3月 C/C++大版内专家分月排行榜第三2007年2月 C/C++大版内专家分月排行榜第三2007年1月 C/C++大版内专家分月排行榜第三2003年7月 C/C++大版内专家分月排行榜第三
2003年9月 C/C++大版内专家分月排行榜第二2002年6月 C/C++大版内专家分月排行榜第二2002年4月 C/C++大版内专家分月排行榜第二
2007年3月 C/C++大版内专家分月排行榜第三2007年2月 C/C++大版内专家分月排行榜第三2007年1月 C/C++大版内专家分月排行榜第三2003年7月 C/C++大版内专家分月排行榜第三
2003年5月 PHP大版内专家分月排行榜第三2003年3月 PHP大版内专家分月排行榜第三
2003年9月 C/C++大版内专家分月排行榜第二2002年6月 C/C++大版内专家分月排行榜第二2002年4月 C/C++大版内专家分月排行榜第二
2007年3月 C/C++大版内专家分月排行榜第三2007年2月 C/C++大版内专家分月排行榜第三2007年1月 C/C++大版内专家分月排行榜第三2003年7月 C/C++大版内专家分月排行榜第三
2003年5月 PHP大版内专家分月排行榜第三2003年3月 PHP大版内专家分月排行榜第三
2003年5月 PHP大版内专家分月排行榜第三2003年3月 PHP大版内专家分月排行榜第三
2003年5月 PHP大版内专家分月排行榜第三2003年3月 PHP大版内专家分月排行榜第三
2009年4月 总版技术专家分月排行榜第一
2009年11月 Linux/Unix社区大版内专家分月排行榜第一2009年6月 Linux/Unix社区大版内专家分月排行榜第一2009年4月 C/C++大版内专家分月排行榜第一2009年3月 C/C++大版内专家分月排行榜第一2009年3月 Linux/Unix社区大版内专家分月排行榜第一2009年2月 Linux/Unix社区大版内专家分月排行榜第一
2003年9月 C/C++大版内专家分月排行榜第二2002年6月 C/C++大版内专家分月排行榜第二2002年4月 C/C++大版内专家分月排行榜第二
2007年3月 C/C++大版内专家分月排行榜第三2007年2月 C/C++大版内专家分月排行榜第三2007年1月 C/C++大版内专家分月排行榜第三2003年7月 C/C++大版内专家分月排行榜第三
2003年9月 C/C++大版内专家分月排行榜第二2002年6月 C/C++大版内专家分月排行榜第二2002年4月 C/C++大版内专家分月排行榜第二
2007年3月 C/C++大版内专家分月排行榜第三2007年2月 C/C++大版内专家分月排行榜第三2007年1月 C/C++大版内专家分月排行榜第三2003年7月 C/C++大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。每个线程都有一个堆栈那么,这个堆栈多大呢?
HANDLE CreateThread( &&&&&& LPSECURITY_ATTRIBUTES , &&&&&& SIZE_T , &&&&&& LPTHREAD_START_ROUTINE , &&&&&& LPVOID , &&&&&& DWORD , &&&&&& LPDWORD
在创建线程的时候可以指定堆栈大 小,dwStackSize=0则使用默认大小
-那默认大小又是多少?
&&&&& 写个小程序算一下~
#include &stdio.h& #include &windows.h&
#define STACK_SIZE 0.5*
DWORD WINAPI ThreadFunc(PVOID pvParam) { &&&&& DWORD dwRet = 0; &&&&& printf("%-3d:0x%x\n",pvParam,&dwRet);
&&&&& return dwR }
int main(int,char**) { &&&&& DWORD dwT &&&&& printf("Main:0x%x\n",&dwTid);
&&&&& for(int i=0;i&50;i++) &&&&&&& CreateThread(NULL,STACK_SIZE,ThreadFunc,(PVOID)i,0,&dwTid); // 莫小注:原作者这处代码有错,这不能修改线程栈大小
&&&&& Sleep(2000); &&&&return 0;
Main:0x12ff78 0&&&&&& :0x50ffb0 1&&&&&& :0x60ffb0 2&&&&&& :0x70ffb0 3&&&&&& :0x80ffb0 4&&&&&& :0x90ffb0
0x60ffb0 - 0x50ffb0 = 0x100000 byte = 1MB
那么这个小程序中线程最小堆栈大小为1MB. (对么?为什么呢?后面有验证) 将STACK_SIZE换成0, 结果和上面一样 将STACK_SIZE换成2, 结果变成2MB
以下是从MSDN中查到的
Generally, the reserve size is the default reserve size specified in
the executable header. However, if
the initially committed size specified by dwStackSize is larger
than the default reserve size, the reserve size is this new commit size
rounded up to the nearest multiple of 1 MB.
根据winnt.h中的&&&&& IMAGE_OPTIONAL_HEADER结构体 typedef struct _IMAGE_OPTIONAL_HEADER { &&&&&& // &&&&&&& // Standard fields. &&&&&&& //
&&&&&&& WORD&&&&&&& M &&&&&&& BYTE&&&&&&& MajorLinkerV &&&&&&& BYTE&&&&&&& MinorLinkerV &&&&&&& DWORD&&&&&& SizeOfC &&&&&&& DWORD&&&&&& SizeOfInitializedD &&&&&&& DWORD&&&&&& SizeOfUninitializedD &&&&&&& DWORD&&&&&& AddressOfEntryP &&&&&&& DWORD&&&&&& BaseOfC &&&&&&& DWORD&&&&&& BaseOfD
&&&&&&& // &&&&&&& // NT additional fields. &&&&&&& //
&&&&&&& DWORD&&&&&& ImageB &&&&&&& DWORD&&&&&& SectionA &&&&&&& DWORD&&&&&& FileA &&&&&&& WORD&&&&&&& MajorOperatingSystemV &&&&&&& WORD&&&&&&& MinorOperatingSystemV &&&&&&& WORD&&&&&&& MajorImageV &&&&&&& WORD&&&&&&& MinorImageV &&&&&&& WORD&&&&&&& MajorSubsystemV &&&&&&& WORD&&&&&&& MinorSubsystemV &&&&&&& DWORD&&&&&& Win32VersionV &&&&&&& DWORD&&&&&& SizeOfI &&&&&&& DWORD&&&&&& SizeOfH &&&&&&& DWORD&&&&&& CheckS &&&&&&& WORD&&&&&&& S &&&&&&& WORD&&&&&&& DllC &&&&&&& DWORD&&&&&& SizeOfStackR &&&&&&& DWORD&&&&&& SizeOfStackC &&&&&&& DWORD&&&&&& SizeOfHeapR &&&&&&& DWORD&&&&&& SizeOfHeapC &&&&&&& DWORD&&&&&& LoaderF &&&&&&& DWORD&&&&&& NumberOfRvaAndS &&&&&&& IMAGE_DATA_DIRECTORY
DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; } IMAGE_OPTIONAL_HEADER32,
*PIMAGE_OPTIONAL_HEADER32;
我推测,应该可以在链接期间指定栈大小 查看link.exe的参数
/STACK:reserve[,commit] 果然如此~~
看到网上有人问如何改变默认的线程堆栈大小,在MSDN中有答案:
The default size for the reserved and initially committed stack memory
is specified in the executable file header. Thread or fiber creation
fails if there is not enough memory to reserve or commit the number of
bytes requested. To specify a different default stack size for all
threads and fibers, use the STACKSIZE statement in the
module definition (.def) file. For more information on
these default sizes and how to change them, see the documentation
included with your linker.
(模块定义 (.def) 文件为链接器提供有关被链接程序的导出、属性及其他方面的信息)
可见,默认线程堆栈大小在链接阶段可以由程序员指定
以上部分载自他人空间.
MSDN中有段话很重要:
To change the reserved stack size, set the dwCreationFlags parameter of
CreateThread or CreateRemoteThread to
STACK_SIZE_PARAM_IS_A_RESERVATION and use the dwStackSize parameter.&
我用MSDN2001版查看的时候,它有注明STACK_SIZE_PARAM_IS_A_RESERVATION 适用于XP系统, 在MSDN2008版没注明了,我是在XP下测试的
下面是我改的测试代码:
&1&#include&"stdafx.h"&2&#include&&stdio.h&&3&#include&&windows.h&&4&&5&#define&STACK_SIZE&64*1024&//&设置线程栈为64K&6&&7&DWORD&WINAPI&ThreadFunc(PVOID&pvParam)&8&{&9&&&&&DWORD&dwRet&=&0;10&&&&&printf("%-3d:0x%x\n",pvParam,&dwRet);11&&&&&Sleep(2000);&&//&避免线程退出,这个线程栈地址又被分配给其它新创建的线程12&&&&&return&dwR13&}14&15&int&main(int,char**)16&{17&&&&&DWORD&dwT18&&&&&printf("Main:0x%x\n",&dwTid);19&20&&&&&HANDLE&handles[10];21&22&&&&&for(int&i=0;i&10;i++)23&&&&&{24&&&&&&&&&handles[i]&=&CreateThread(NULL,STACK_SIZE,ThreadFunc,(PVOID)i,STACK_SIZE_PARAM_IS_A_RESERVATION&,&dwTid);25&&&&&&&&&Sleep(100);&//&保证每次Create后得到的线程栈地址是递增的26&&&&&}27&&&&&for(int&i=0;&i&10;&i++)28&&&&&{29&&&&&&&&&CloseHandle(handles[i]);30&&&&&}31&32&&&&&getchar();33&&&&&return&0;34&}
&& -----CreateThread(NULL,STACK_SIZE,ThreadFunc,(PVOID)i,STACK_SIZE_PARAM_IS_A_RESERVATION&,&dwTid);
&每次相差(10000)x = (655366)d = 64*1024, 设置成功,64K.
另外,&Linux平台的栈默认大小应该是8192KB, Windows平台的栈默认大小应该是1024KB, 项目移植的时候要注意设置, 免得空间不足, 分配失败
阅读(...) 评论()

我要回帖

更多关于 vs2010 堆栈 的文章

 

随机推荐