一般来说,我们所用的内存有堆和栈之分,其余的我们很少控制,栈的速度快,但是空间少,不灵活;而堆的空间几乎可以满足任何要求:灵活,但是相对速度要慢了很多,并且在VC中堆是人为控制的,new了就要delete,否则很容易产生内存泄漏等问题;
OS | 栈的字节数 | bits | digits | 以兆为单位的值 |
---|---|---|---|---|
Linux | 8192K | <=62407 | <= 18786 | 默认8M |
Windows | 1024K | <=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