C ++在哪一点上使用堆而不是堆栈是有意义的?

时间:2014-09-07 17:21:02

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

例如:

void a()
{
    int bla;

    bla = 1;
}

VS

void b()
{
    std::unique_ptr<int> bla( new int );

    *bla   = 1;
}

什么时候被认为是好的做法?什么时候不是吗?或者仅仅是在旁观者眼中?只有在处理大型项目或处理大值项目时才有意义吗?

当然堆稍慢。

3 个答案:

答案 0 :(得分:3)

在Windows平台上,默认堆栈限制为~1兆字节,这意味着您肯定应该在堆上放置更大的对象而不是更改默认值(或者更糟无论如何都要执行它并希望最好)。在尝试之前检查您的环境堆栈大小限制。另外:如果你的算法是递归的,请记住你的堆栈限制也会承受压力。因此也要注意你的算法。

需要记住的一点是,堆栈对象将在函数调用结束时被销毁,而堆栈对象(除非您使用智能指针 - ,建议)将不。你应该相应地计划你的选择。根据经验,除了一些例外情况,大型长时间跨越对象应该在堆上。

对于大多数应用程序而言,性能差异也可以忽略不计。由于堆栈分配( premature optimization is the root of all evils 的性能提升很小,因此甚至不考虑构建整个程序。此外,巨大的减速通常来自过多的复制内容(或分配太多次小对象),而不是来自堆栈/堆分配选择。

答案 1 :(得分:0)

如果您不确定(在编译时)所需的内存量,则应首选动态分配(即堆)。否则,请使用堆栈。

另一点:一般来说,堆栈大小比堆大小要小得多。因此,如果需要大量内存(例如,以MB为单位),那么,即使已知大小,最好使用堆。

答案 2 :(得分:0)

使用函数范围变量,您不太可能超出程序堆栈大小。即使你在一个函数中声明了很多C ++对象,它们也必须非常大才能超过堆栈限制。所以我不认为这是你日常编码中必须担心的事情。只要有意义,就将C ++对象和本机类型声明为堆栈变量。如果确实需要使用动态分配,总是使用smart pointer或STL容器进行收集(例如:std::vector)。

一般来说,当您必须将对象的生命周期延长到声明它的范围之外时(例如:从函数返回一个对象)或者当一个集合的大小(例如一个集合)时,需要动态内存分配。数组,在编译时不知道。否则,您应该更喜欢短寿命/范围对象。