【问题标题】:Time/Space Trade-Off in Dynamic Array Allocation in Heap vs. Stack?堆与堆栈中动态数组分配的时间/空间权衡?
【发布时间】:2013-12-21 21:14:01
【问题描述】:

当我遇到这个问题时,我一直在阅读我的《编程语言》一书(这本书在概念上的技术性往往比我想象的要多得多):

当动态数组的分配发生在运行时堆栈而不是堆中时,时间和空间上的权衡是什么?

在我看来,我想当分配发生在堆栈中时,它会占用更少的空间,但更多的时间,而在堆中,排序需要更长的时间,但分配所需的空间更少?

任何人都可以确认/破坏我对此的思考过程吗?

【问题讨论】:

  • 当你有language-agnostic这样的标签时,你不需要像c#这样的标签
  • C# 是我最熟悉的。从 C# 的角度考虑似乎很适合解决。
  • 这在语言之间会有相当大的差异;它不能真正用语言不可知的庄园来回答。

标签: c# arrays language-agnostic programming-languages computer-science


【解决方案1】:

很难理解为什么一个数组(或其他东西)应该使用更多或更少的空间,具体取决于分配的内存部分。此外,除非堆分配是以类似 malloc 的方式实现的,否则分配无非是固定起始地址和碰撞指针。

真正的权衡是创建的对象/数组的可能生命周期。虽然它可以比在堆上创建的函数/方法寿命更长,但在分配堆栈时肯定不能。

您可以节省一些 CPU 周期的唯一一点是通过对象的释放。当堆栈帧被丢弃时,堆栈对象无需额外的努力就会消失。必须对堆对象 OTOH 进行垃圾回收。

【讨论】:

    【解决方案2】:

    @ingo 是正确的。我还想补充一点,一般来说,堆的大小比堆栈的大小要大几个数量级。因此,一个折衷方案是在任一空间中分配数组时有多少可用空间,例如,如果我必须创建一个 300 Mb 的数组,那么堆可能是我的最佳选择。

    【讨论】:

    • the size of a heap is orders of magnitude larger than a stack size 这真的取决于语言(甚至它的实现)。
    • @Servy Granted,但这就是我说“一般”的原因。对于 C# 来说,在这个问题中使用了哪个标签尤其如此。
    【解决方案3】:

    空间:

    通常内存分配器会向上取整所需的内存量,以便进行对齐。

    所以使用堆会有一些内存开销。一些编译器也可能对基于堆栈的数组做同样的事情。这一切都取决于具体情况。

    时间:

    内存分配器的时间开销可能很大。

    对于基于堆栈的,通常是更改堆栈指针,这非常快。

    再次,细节。

    【讨论】:

      猜你喜欢
      • 2012-07-19
      • 2017-03-25
      • 2012-12-26
      • 1970-01-01
      • 2021-05-20
      • 2023-04-02
      • 2012-03-02
      • 2011-10-06
      • 1970-01-01
      相关资源
      最近更新 更多