【发布时间】:2012-09-08 17:44:43
【问题描述】:
过去,每当我需要创建一个类的实例时,我都会使用 new 在堆上分配它(除了 stl 类,以及像 vec3 和 mat4 这样的数学类)。
但是,我只是批判性地查看了我的一些代码,并意识到从技术上讲,我可以只是在堆栈上创建这些类。它们不是很大,不需要在当前范围之外进行修改,等等。当我(偶尔)需要将它们传递给另一个函数时,我可以像传递指针一样轻松地使用引用。
过去我总是默认在堆上分配,并且只在某些情况下使用堆栈,但是现在我想知道默认在堆栈上分配是否会更好,并且只在以下情况下使用堆
- 确实需要一个指针(即对象的生命周期要超过声明的范围)
- 类或数组对于堆栈来说太大了
- 继承需要它(抽象基类/接口)
- 还有别的吗?
这也提出了一个问题:一个类有多大(大致)以至于无法在堆栈上合理分配? (假设我们至少在开发智能手机,并升级到高端台式机)我是否只是不必要地担心堆栈大小限制? (可能,只要我们不是在谈论大型数组,并且任何类都不会接近一千字节)
【问题讨论】:
-
我会补充一点,当您希望对象的生命周期超过声明范围时。在您的列表中,我将删除所有可能的类大小参数。
-
不是一个直接的答案,但堆栈分配确实比堆分配有一些真正的优势(例如速度、自动范围等)This answer 列举了其中的一些。
-
@juanchopanza 我认为这是“真正需要指针”的情况之一
-
“一个类有多大(大致)太大而无法在堆栈上合理分配” - 这完全取决于实现。对于某些实现(微控制器等),4k 的堆栈是巨大的。对于其他人来说,这绝对是微不足道的。该标准没有为可移植代码提供任何方法来确定它是什么,并且当您使用太多堆栈时的行为是程序被不客气地终止如果你很幸运。您只需决定是否要编写“低堆栈友好”的代码,然后抓住机会。
-
@stevejessop 我正在开发一个游戏引擎,所以我想基于智能手机级别的 arm6/7 的系统将在堆栈大小方面处于低端
标签: c++