在问另一个问题(以及之前)时,我想知道如何判断是在堆上创建对象还是将其作为堆栈上的对象保留?关于对象,我应该问自己什么才能做出正确的分配?
5 回答
如果必须的话,把它放在堆上,如果可以的话,把它放在栈上。
你需要把什么样的东西放在堆上?任何长度不一的东西。任何可能需要为空的对象。任何非常大的东西,以免导致堆栈溢出。
简单的回答。
当它超出范围时,您是否希望它挂起并能够使用它?
取决于对象的预期寿命。
- 如果您希望对象即使在函数返回后仍处于活动状态,则为 HEAP,否则为 STACK
如果一个对象被放置在 HEAP 中,那么一旦它的使用结束,程序员必须显式地释放或删除它;否则程序将泄漏内存。
使用堆的两个原因:
1-您想要当前范围之后的数据。
2-你想保留大内存。
除此之外留在堆栈上。
注意:不要在堆栈上保留大量内存,否则你会得到一个“堆栈溢出”;)
堆栈内存很快。它很快,因为 (a) 没有系统开销来分配内存 - 分配是通过简单地在一条指令中移动堆栈指针来完成的,并且 (b) 堆栈中的内存是“热的”,因此它已经在缓存中。堆内存很慢,因为 (a) 它需要大量的系统工作来环顾四周并找到一块空闲的内存,并且 (b) 可能不在缓存中,并且需要驱逐一些您可能想要的数据。
堆栈内存不会碎片化。堆最终可能会变得如此碎片化,您无法分配任何东西(尽管具有讽刺意味的是仍然有足够的未使用内存!)
对于长期存在的数据和大数据(多 KB 或更多),您必须使用堆。
分配更大堆栈的危险在于,如果正在运行多个线程,它可能会伤害您。您必须为“最坏情况”使用调整堆栈大小。每个线程都需要自己的堆栈。在高核心数机器上(您可能有 200 多个线程在运行),您可能不想随意增加堆栈。另一方面,堆不需要为“最坏情况”使用而调整大小 - 它效率更高。