目录
💖 前言
💖 简介
这里先给出结论,后面进行验证。
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;
}
运行多次会出现栈溢出错误,如下:
结论:
🏆 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;
}
结果:
段错误(吐核)
结论:
💖 递归函数对栈大小的影响
先看一段错误代码:
#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
结论:
💖 修改栈大小
🏆 windows平台下
项目-》属性-》链接器-》系统中修改栈空间,如下:
🏆 linux平台下
针对上面代码,临时修改:
[root@localhost stackDemo]# ulimit -s 20000
[root@localhost stackDemo]# ./stack
1111111
[root@localhost stackDemo]# ulimit -s
20000
💖 总结
💚 不要在栈空间上定义大数组或大对象,大数组或大对象使用堆进行存放。
💚 尽量避免层次多的递归函数使用。