C++ C++;何时在堆与堆栈上分配?

C++ C++;何时在堆与堆栈上分配?,c++,memory-management,stack,heap,C++,Memory Management,Stack,Heap,在问另一个问题时(之前也是),我想知道如何判断是在堆上创建对象还是将其作为堆栈上的对象?关于对象,我应该问自己什么才能做出正确的分配?简单的答案 当它超出范围时,是否希望它挂起并能够使用它?如果必须,将它放在堆上,如果可以,则放在堆栈上 你需要把什么样的东西放在堆上?任何长度不同的东西。任何可能需要为null的对象。任何非常大的值,以免导致堆栈溢出。取决于对象的预期寿命 如果您希望即使在函数返回后对象仍处于活动状态,则可以使用HEAP、else和STACK 如果一个对象被放置在堆中,那么一旦

在问另一个问题时(之前也是),我想知道如何判断是在堆上创建对象还是将其作为堆栈上的对象?关于对象,我应该问自己什么才能做出正确的分配?

简单的答案


当它超出范围时,是否希望它挂起并能够使用它?

如果必须,将它放在堆上,如果可以,则放在堆栈上

你需要把什么样的东西放在堆上?任何长度不同的东西。任何可能需要为null的对象。任何非常大的值,以免导致堆栈溢出。

取决于对象的预期寿命

  • 如果您希望即使在函数返回后对象仍处于活动状态,则可以使用HEAP、else和STACK

如果一个对象被放置在堆中,那么一旦它的使用结束,程序员必须显式地释放或删除它;否则程序将泄漏内存。

使用堆的两个原因:

1-您希望数据位于当前范围之后

2-您想保留大内存

除此之外,请保持在堆栈上


注意:不要在堆栈上保留大量内存,否则会出现“堆栈溢出”;)

堆栈内存很快。它的速度很快,因为(a)分配内存没有系统开销-分配是通过简单地移动一条指令中的堆栈指针来完成的,(b)堆栈中的内存是“热的”,因此它已经在缓存中。堆内存的速度很慢,因为(a)它需要大量的系统工作来查找并找到可用的内存块,(b)可能不在缓存中,需要逐出一些您可能需要的数据

堆栈内存不会碎片化。堆最终可能变得如此碎片化,以至于您无法分配任何东西(尽管讽刺的是,仍然有足够的未使用内存!)

对于长寿命数据和大数据(多KB或更多),必须使用堆


分配更大堆栈的危险在于,如果正在运行多个线程,可能会对您造成伤害。您必须根据“最坏情况”使用情况调整堆栈大小。每个线程都需要自己的堆栈。在高内核数机器上(可能有200多个线程在运行),您可能不希望任意增加堆栈。另一方面,堆的大小不需要根据“最坏情况”的使用情况而定,它的效率要高得多。

当然,除非您从函数返回所述对象。然后,有很多情况下,通过值返回对象是好的,而不是指向它的指针。需要考虑静态数据。应该注意的是,即使在满足其他标准的情况下,在堆栈上放置巨大的对象也不是一个好主意。特别是没有乐趣超过C++的堆栈限制…@ Voo是的,但多久会发生这种情况?容器类动态地分配它们的内存,所以我认为可以肯定地说,大小为1KB的对象(a)是巨大的,(b)是罕见的。让我们考虑一个深度为50的调用堆栈,在每个函数的堆栈框架中有20个这些巨大的对象,而您仍然只有1MB堆栈。@ VoO-您可以增加堆栈大小。您也可以编写没有堆的代码——这是各种安全关键行业所要求的,并且必须更改操作系统特定的限制才能执行您的代码不会让您觉得设计特别糟糕?如果限制取决于输入大小,则问题尤其严重@美国2012年罕见的情况?我真的希望如此,但是如果你正好处于其中一个位置,那么这与建议有什么关系?@voo-如果软件有固定的输入(就像发电站一样),并且软件需要从古到今24 x 7运行,避免内存碎片和与悬空指针相关的问题。欢迎来到安全关键软件世界#我同意你的说法,但我不理解“任何可能需要为null的对象”。“空”是什么意思?当然不是传统的
NULL
nullptr