【问题标题】:Why do we need to create an object in heap?为什么我们需要在堆中创建一个对象?
【发布时间】:2018-08-03 18:37:34
【问题描述】:

为什么我们可以使用堆栈来满足我们的所有需求?

注意:如果你在解释的时候举个例子会很好,因为通过例子更容易理解。

抱歉英语不好。

【问题讨论】:

  • 没有上下文很难说出原因。
  • 询问编写代码的人。一个可能的原因是物理对象太大而无法放入堆栈。
  • 一些对象对于堆栈来说太大了......它需要在函数结束后继续存在......程序员觉得它......
  • 因为他不想??

标签: c++ memory heap-memory stack-memory


【解决方案1】:

在实践中,call stack 是有限且小的。典型的限制是几兆字节。相反,您通常可以在堆内存中分配千兆字节。

(在一些系统上,您可能会将系统配置为拥有更大的堆栈;但如果需要,您需要告诉您的用户)

此外,最重要的是,调用堆栈是一个堆栈,因此有一个LIFO(后进先出)规则。在许多情况下,您希望以与其分配无关的顺序释放对象,或者只是以“先分配,先销毁”的顺序(这在堆栈上是不可能的)。

考虑阅读有关垃圾收集的内容,例如GC handbook。它教您有关dynamic memory allocation 的有用概念和术语(即使对于具有手动内存管理的C 程序)。另请阅读有关您进程的virtual address space 的信息(另请参阅this 答案,至少对于Linux)。

动态内存分配的另一个优点是同一个可执行文件可以在不同的计算机上运行(具有不同的资源,特别是不同数量的 RAM),但不能处理相同数量的数据。如果您必须静态分配所有内存,则情况并非如此(例如,具有 50 GB 静态数据的 C 程序甚至无法在我的笔记本电脑上启动)。

【讨论】:

  • @StelTeam:提醒:调用函数时,参数也可能放在堆栈上。
  • 这取决于 ABI。在我的 Linux/x86-64 系统上,最多六个参数通过寄存器,而不是在堆栈上
  • 实际上,堆栈与为其分配的空间一样大。 default 可能很小(相对于某些应用程序的需要),但几乎总有一些方法可以显式地为堆栈保留空间。
  • 真正的原因是 LIFO。如果新节点的生命周期不能超过创建它的函数调用的持续时间,那么编写一个将新节点添加到链接数据结构的函数有点困难。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-29
  • 2018-09-22
  • 2012-05-30
  • 1970-01-01
  • 2015-03-28
相关资源
最近更新 更多