在询问另一个问题时(以及之前)我想知道如何判断是在堆上创建对象还是将其作为堆栈中的对象?我应该问自己有关正确分配的对象?
答案 0 :(得分:8)
如果必要的话,把它放在堆上,如果可以的话,把它放在堆上。
你需要把哪些东西放在堆上?任何长度不一的东西。任何可能需要为null的对象。任何非常大的东西,以免造成堆栈溢出。
答案 1 :(得分:6)
简单回答。
当它超出范围时,你想让它闲逛并能够使用吗?
答案 2 :(得分:3)
取决于对象的预期生命周期。
如果一个对象放在HEAP中,那么一旦它的用法结束,它必须由程序员明确地自由()编辑或删除;否则程序将泄漏内存。
答案 3 :(得分:1)
使用堆的两个原因:
1-您想要当前范围之后的数据。
2-您想要保留大容量内存。
除了留在堆栈上。
注意:不要在堆栈上保留大量内存,否则会出现“堆栈溢出”;)
答案 4 :(得分:0)
堆栈内存很快。它很快,因为(a)没有系统开销来分配内存 - 分配是通过简单地在一条指令中移动堆栈指针来完成的,并且(b)堆栈中的内存是" hot"所以它已经在缓存中了。堆内存很慢,因为(a)它需要大量的系统工作来环顾四周并找到一大堆内存,而且(b)可能不在缓存中,并且需要驱逐你可能想要的一些数据。
堆栈内存不会碎片化。堆最终可能会如此碎片化,您无法分配任何东西(尽管具有讽刺意味的是,仍有足够的未使用内存!)
对于长寿命数据和大数据(多KB或更多),您必须使用堆。
分配更大堆栈的危险在于,如果运行多个线程,可能会对您造成伤害。你必须为#34;最坏的情况"用法。每个线程都需要自己的堆栈。在高核心数的机器上(可能有200多个线程在运行),您可能不想随意增加堆栈。另一方面,堆不需要针对"最坏情况"用法 - 效率更高。