【问题标题】:C++ at which point does it make sense to use the heap instead of the stack? [duplicate]C++ 在什么时候使用堆而不是堆栈有意义? [复制]
【发布时间】:2014-09-07 17:21:01
【问题描述】:

例如:

void a()
{
    int bla;

    bla = 1;
}

对比

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

    *bla   = 1;
}

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

当然堆稍微慢一点。

【问题讨论】:

  • 考虑到 Windows 上的堆栈大小默认为 1 MB,如果您打算使用更多,则绝对应该使用堆而不是更改默认值
  • @KugBuBu:不。这是一个询问何时适合使用自动存储(例如堆栈)和分配存储(例如堆)的问题。
  • 您永远不应该使用第二个代码 sn-p。如果要使用堆分配,请使用std::unique_ptr&lt;T&gt;std::unique_ptr&lt;T[]&gt;std::vector&lt;T&gt;
  • @KugBuBu:你不能使用重复建议工具两次,但你可以留下另一个评论更好的重复。
  • @deW1 无论如何我发现了一些可能对你有帮助的东西:stackoverflow.com/questions/7973138/…

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


【解决方案1】:

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

要记住的重要一点是,堆栈对象将在函数调用结束时被销毁,而堆对象(除非您使用智能指针 - 推荐)不会。你应该相应地计划你的选择。根据经验,大的长时间跨度对象应该放在堆上,但有一些例外。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      一般来说,当您必须将对象的生命周期延长到超出其声明的范围(例如:从函数返回对象)或集合的大小(例如数组,在编译时未知。否则,您应该更喜欢短寿命/作用域的对象。

      【讨论】:

        猜你喜欢
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 2013-06-16
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        • 2011-06-25
        • 1970-01-01
        相关资源
        最近更新 更多