【发布时间】:2021-07-09 07:37:48
【问题描述】:
我应该考虑使用new 关键字(或任何其他动态分配方法)在堆/空闲存储上分配什么结构大小,而不是在堆栈上分配?
10 字节? 20字节? 200 字节? 2KB? 2MB?从来没有?
即使我想通过指针传递它,我仍然可以从堆栈变量中获取引用。我知道堆栈变量会在范围结束时消失,而动态分配的变量不会。无论哪种方式我都可以处理,但到目前为止,我还没有找到任何关于 when 动态分配的指导。当然,不要在堆栈上放太多东西来避免堆栈溢出……但是有多少是太多了?
任何指导将不胜感激。
【问题讨论】:
-
IMO 你应该尽可能避免
new(和new[])。如果你真的需要一个指针,那么使用像std::unique_ptr或std::shared_ptr这样的智能指针(取决于所需的所有权语义),或者如果你需要一个“动态数组”(即改为使用std::vector)new[])。 -
堆栈大小有限。您可能无法在堆栈上分配 2MB。
-
多少算太多? .. 这大概取决于您的软件运行的系统。对于新的(ish)PC,运行 64 位操作系统(如 Windows 10 或 macOS),然后使用(比如说)16k 的堆栈就可以了;但是对于嵌入式 8 位微处理器,这会导致问题。在这些极端之间有很多“光谱”。
-
堆栈大小取决于您的平台。有些默认为 8MB,有些为 1MB,有些为 64KB。我什至研究过一个堆栈大小为 256 字节的堆栈。
-
作为指南,MSVC 静态分析器(用于 64 位构建)对使用超过 16k 堆栈空间的函数(默认情况下)发出警告 - 设置为
/analyze:stacksize '16384'