一个人应该在堆栈上分配的最大数量
Max amount one should allocate on the stack
我一直在Stack Overflow中搜索关于应该在堆栈上分配的最大内存量的指导原则。
我看到了堆栈与堆分配的最佳实践,但在关于应该在堆栈上分配多少以及应该在堆上分配多少的指导原则上没有数字。
有什么想法/数字可以作为指导?我应该什么时候在堆栈上分配,而不是在堆上分配,多少才算太多?
在典型情况下,堆栈限制在1-4兆字节左右。为了给代码的其他部分留出空间,如果可能的话,您通常希望将单个堆栈帧限制在不超过几十KB左右。当/如果涉及(或可能涉及)递归时,您通常希望对其进行更多的限制。
这里的答案取决于代码运行的环境。在小型嵌入式系统上,整个堆栈可能只有几千字节。在桌面上运行的大型系统上,堆栈通常以兆字节为单位。
对于台式机/大型嵌入式系统,几KB通常是可以的。对于小型嵌入式系统来说,这可能根本不起作用。
另一方面,当频繁调用new/delete时,堆的过度使用可能会导致过多的开销。因此,在典型的情况下,您不应该对非常小的对象使用堆分配,除非其他设计标准有必要(例如,您需要一个指针永久存储在某个地方,而堆栈不适用于此,因为您在对象完成之前从当前函数返回)。
当然,重要的是整体设计。如果您有一个非常简单的应用程序,有几个函数,其中没有一个是递归的,那么可以在main
或更高级别中分配几百KB。另一方面,如果你正在制作一个通用的库,那么使用超过几千字节可能不会让你受到使用该库的开发人员的欢迎。如果这个库是在低内存系统(洗衣机、老式手机等)上运行的,那么使用超过几百个字节可能是个坏主意。
在堆栈上进行尽可能小的分配。对数据集使用堆,否则堆栈分配将贯穿作用域的整个生命周期,可能会破坏缓存。
相关文章:
- 找到不大于 A 的最大数的最有效方法,该数可被 B 整除
- C++:最大数组值函数工作不正常
- 在浮点数32中保存浮点数16最大数
- 使用 DP 的非相邻元素的最大数组总和
- 找到第 n 个最大数无限循环C++
- 最大数组大小
- C 最大数组大小
- 如何在GPU内存中获取最大数组大小
- 具有最大数组函数的程序
- 这是在包含非唯一元素的未排序数组中选择第k个最大数的最快算法
- 如何递归地找到最大数组元素的索引
- 递归最大数求和
- 在堆上分配最大内存
- 如何找到数组中的最大数并用c++显示
- integer常量太大,以至于在为枚举分配最大类型值时它是无符号的
- 给定一系列整数,提供第k个最大数
- 在任意加长的集合中查找最大数不起作用
- IEEE 754浮点数,1<的最大数是多少?
- 不与V互质的最大数
- C++是否有最大数组长度限制