一个人应该在堆栈上分配的最大数量

Max amount one should allocate on the stack

本文关键字:分配 最大数 堆栈 一个人      更新时间:2023-10-16

我一直在Stack Overflow中搜索关于应该在堆栈上分配的最大内存量的指导原则。

我看到了堆栈与堆分配的最佳实践,但在关于应该在堆栈上分配多少以及应该在堆上分配多少的指导原则上没有数字。

有什么想法/数字可以作为指导?我应该什么时候在堆栈上分配,而不是在堆上分配,多少才算太多?

在典型情况下,堆栈限制在1-4兆字节左右。为了给代码的其他部分留出空间,如果可能的话,您通常希望将单个堆栈帧限制在不超过几十KB左右。当/如果涉及(或可能涉及)递归时,您通常希望对其进行更多的限制。

这里的答案取决于代码运行的环境。在小型嵌入式系统上,整个堆栈可能只有几千字节。在桌面上运行的大型系统上,堆栈通常以兆字节为单位。

对于台式机/大型嵌入式系统,几KB通常是可以的。对于小型嵌入式系统来说,这可能根本不起作用。

另一方面,当频繁调用new/delete时,堆的过度使用可能会导致过多的开销。因此,在典型的情况下,您不应该对非常小的对象使用堆分配,除非其他设计标准有必要(例如,您需要一个指针永久存储在某个地方,而堆栈不适用于此,因为您在对象完成之前从当前函数返回)。

当然,重要的是整体设计。如果您有一个非常简单的应用程序,有几个函数,其中没有一个是递归的,那么可以在main或更高级别中分配几百KB。另一方面,如果你正在制作一个通用的库,那么使用超过几千字节可能不会让你受到使用该库的开发人员的欢迎。如果这个库是在低内存系统(洗衣机、老式手机等)上运行的,那么使用超过几百个字节可能是个坏主意。

在堆栈上进行尽可能小的分配。对数据集使用堆,否则堆栈分配将贯穿作用域的整个生命周期,可能会破坏缓存。