Windows栈大小

一般来说,我们所用的内存有堆和栈之分,其余的我们很少控制,栈的速度快,但是空间少,不灵活;而堆的空间几乎可以满足任何要求:灵活,但是相对速度要慢了很多,并且在VC中堆是人为控制的,new了就要delete,否则很容易产生内存泄漏等问题;

OS栈的字节数bitsdigits以兆为单位的值
Linux8192K<=62407<= 18786默认8M
Windows1024K<=10581<= 3185默认1M

普通的Win32线程有两个栈:一个是用户栈,一个是内核栈;如果是内核创建的系统工作线程,则只有内核栈。只要代码在内核中运行,线程就一定是使用其内核栈的;

栈的主要作用是维护函数调用帧,以及为局部变量提供空间;

局部变量可能是因为:

  • 寄存器数目过少导致没有足够多的寄存器存储变量,所以需要在栈上存储变量;
  • 局部变量是数组或者结构类型,只能在栈上存储不能在寄存器中存储;
  • 需要对某些变量取地址,这时候需要给这些变量在栈空间上分配内存;

用户栈可以指定其大小,默认是1M,通过编译指令/stack可改设其他值;

普通内核栈的大小是固定的,由系统根据CPU架构而定,x86系统上为12KB,x64系统上为24KB,安腾系统上为32KB。对于GUI线程,普通内核栈空间可能不够,所以系统又定义了“大内核栈”概念,可以在需要的时候增长栈空间。只有GUI线程才能使用大内核栈,这也是系统规定的。

Windows下程序栈空间的大小,VC++ 6.0 默认的栈空间是1M

VC6.0中修改堆栈大小的方法:

  • 选择 “Project->Setting”.
  • 选择 “Link”.
  • 选择 “Category”中的 “Output”.
  • 在 “Stack allocations”中的”Reserve:”中输栈的大小

在VS中设置堆栈大小的方法为:

  • 选择 “项目->属性”.
  • 选择 “链接器”.
  • 选择 “系统”.
  • 在 “堆栈保留大小”中输栈的大小
Linux下程序栈空间的大小

Linux下非编译器决定栈带下,而是有OS决定的,Windows平台下栈的大小是被记录在可执行文件中的(由编译器来设置),即:Windows下可以由编译器来决定栈大小,而在Linux下由系统环境变量来控制栈的大小

在Linux下通过如下命令可查看和设置栈的大小:

命令: ulimit -a # 显示当前栈的大小 (ulimit为系统命令,非编译器命令)
命令: ulimit -s 32768 # 设置当前栈的大小为32M bytes

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值