💖 前言
如有理解不对的地方,欢迎各位指出,大家共同交流和学习。 如有帮助,请点赞加支持! 送人玫瑰手有余香!🌹🌹🌹
💖 简介
这里先给出结论,后面进行验证。
Windows系统中,栈的大小被记录在可执行文件中,由编译器设置决定,VS2013中栈大小理默认为1M。
linux系统中,栈大小不是由编译器决定,而是由操作系统决定,栈大小默认为8M。
本文测试环境如下:
windows平台:使用vs2013,x86
linux下平台:Centos7
💖 栈大小
针对windows和linux两个平台进行介绍
🏆 windows平台
先看一段正确代码:
int main()
{
const int N = 993 * 1024;
char arr[N] = {0};
cout << "1111111" << endl;
return 0;
}
结果:
1111111
先看一段错误代码:
int main()
{
const int N = 994 * 1024;
char arr[N] = {0};
cout << "1111111" << endl;
return 0;
}
运行多次会出现栈溢出错误,如下:
结论:
程序在993*1024时还正常,在994*1024时,就会出现栈溢出。可能包含几K的栈信息数据,因此,栈空间确实为1M。
🏆 linux平台
linux下可以通过命令直接查看栈大小:
[root@localhost ~]# ulimit -s
8192
即linux平台默认栈大小8M(8192).
下面进行代码测试。
测试代码1:
int main()
{
const int N=8185*1024;
char arr[N];
cout<<"1111111"<<endl;
return 0;
}
结果:
111111
测试代码2:
int main()
{
const int N=8186*1024;
char arr[N];
cout<<"1111111"<<endl;
return 0;
}
结果:
段错误(吐核)
结论:
程序在8185*1024时还正常,在8186*1024时,就会出现栈溢出。可能包含几K的栈信息数据,因此,栈空间确实为8M。
💖 递归函数对栈大小的影响
先看一段错误代码:
#include<iostream>
#include<cstring>
using namespace std;
void test(int group)
{
const int N=819*1024;
char arr[N];
group--;
if(group>0)
{
cout<<"stack: "<<group<<endl;
test(group);
}
}
int main()
{
int n=10;
test(10);
return 0;
}
结果:
[root@localhost stackDemo]# g++ stack.cpp -o stack
[root@localhost stackDemo]# ./stack
stack: 9
stack: 8
stack: 7
stack: 6
stack: 5
stack: 4
stack: 3
stack: 2
stack: 1
段错误(吐核)
正确代码:
#include<iostream>
#include<cstring>
using namespace std;
void test(int group)
{
const int N=818*1024;
char arr[N];
group--;
if(group>0)
{
cout<<"stack: "<<group<<endl;
test(group);
}
}
int main()
{
int n=10;
test(10);
return 0;
}
结果:
[root@localhost stackDemo]# g++ stack.cpp -o stack
[root@localhost stackDemo]# ./stack
stack: 9
stack: 8
stack: 7
stack: 6
stack: 5
stack: 4
stack: 3
stack: 2
stack: 1
结论:
实验发现,同样使用linux环境下默认的8M栈空间,递归9次,函数内的局部变量分配空间只能为818*1024,超过这个范围就会出现栈溢出,局部变量空间分配范围远小于不递归情况,这是因为,函数内部的局部变量所占栈空间随着递归次数的增加而持续增加,不会被释放,所以,尽量避免层次多的递归函数使用。
💖 修改栈大小
🏆 windows平台下
项目-》属性-》链接器-》系统中修改栈空间,如下:
🏆 linux平台下
针对上面代码,临时修改:
[root@localhost stackDemo]# ulimit -s 20000
[root@localhost stackDemo]# ./stack
1111111
[root@localhost stackDemo]# ulimit -s
20000
💖 总结
💚 不要在栈空间上定义大数组或大对象,大数组或大对象使用堆进行存放。
💚 尽量避免层次多的递归函数使用。