博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么要限制栈的大小?
阅读量:3913 次
发布时间:2019-05-23

本文共 658 字,大约阅读时间需要 2 分钟。

栈大小不够用不是容易出现溢出吗?


是为了阻止不靠谱的程序员进入这个行业。 
当然,真正的原因其实是栈的地址空间必须连续,如果任其任意成长,会给内存管理带来困难。对于多线程程序来说,每个线程都必须分配一个栈,因此没办法让默认值太大。 
当然可能有人会说64位系统上这个不是问题,但大家反正已经用了32位系统这么多年(只有4GB甚至2GB地址空间是可以给用户用的),已经习惯了,而且现代化的内存分配器通过类似slab allocator这样的设计已经尽可能令相关数据尽可能放在一起,从CPU数据缓存角度,绝大多数程序并不需要在栈上分配内存(题外话:栈缓冲区溢出的后果比堆缓冲区溢出要严重许多,而在堆上分配缓冲区则可以避免前者)。
semiconductor 写到:
64位系统上这个不是问题,64位系统下的状况是什么样的?
任何情况下必须满足下列不等式: 
引用:
堆栈地址最大值×线程数目最大值<用户态内存地址最大值
而64位系统上用户态内存地址可以超过4G啊。 
其实无论如何都会有限制的。就算你电脑上只跑一个单进程单线程,一头是程序代码,静态数据,malloc 自由分配的堆内存,另一头是堆栈。只要不停地让堆栈生长(调用的函数层次足够深,在堆栈上分配大量局部变量,比如大数组什么的),由于存储容量一定是一个有限值,堆栈迟早要把另一头的东西吃掉,那样你就麻烦了。 
最常见的是写的递归算法中有错误,反复压栈,导致溢出。由于合理的算法不会消耗太多堆栈空间,所以可以规定一个值,超过了红牌罚下。
_________________

转载地址:http://ptcrn.baihongyu.com/

你可能感兴趣的文章
datawhale课程[动手学数据分析]——Task02:数据清洗简述
查看>>
《统计学习方法第二版》学习笔记2——感知机
查看>>
《统计学习方法第二版》学习笔记3——K近邻法
查看>>
MySQL: win10安装MySQL 8.0.21成功记录【转载】
查看>>
IT从业者的迷思与求解之道——座谈会实录摘选
查看>>
程序员过关斩将--数据库的乐观锁和悲观锁并非真实的锁
查看>>
被忽略的TraceId,可以用起来了
查看>>
[原]调试PInvoke导致的内存破坏
查看>>
【NServiceBus】什么是Saga,Saga能做什么
查看>>
ASP.NET Core 集成测试中模拟登录用户的一种姿势
查看>>
程序员修神之路--容器技术为什么会这么流行(记得去抽奖)
查看>>
[ASP.NET Core 3框架揭秘] 异步线程无法使用IServiceProvider?
查看>>
.NET Core 3.0之深入源码理解HealthCheck(一)
查看>>
收藏!推荐12个超实用的Visual Studio插件
查看>>
2020年你应该学习 .Net Core
查看>>
[译文] C# 8 已成旧闻, 向前, 抵达 C# 9!
查看>>
.NETCore3.1中的Json互操作最全解读-收藏级
查看>>
【实战 Ids4】║ 给授权服务器加个锁——HTTPS配置
查看>>
2020年了,再不会Https就老了
查看>>
Kubernetes,多云和低代码数据科学:2020年最热门的数据管理趋势
查看>>