0
点赞
收藏
分享

微信扫一扫

栈空间最大值问题

高子歌 2022-05-03 阅读 38
c++linuxbash

在这里插入图片描述

目录

💖 前言

💖 简介

这里先给出结论,后面进行验证。

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

💖 总结

💚 不要在栈空间上定义大数组或大对象,大数组或大对象使用堆进行存放。
💚 尽量避免层次多的递归函数使用。

举报

相关推荐

0 条评论