代码之家  ›  专栏  ›  技术社区  ›  ahmet alp balkan

性能BTW堆栈动态数组

  •  3
  • ahmet alp balkan  · 技术社区  · 16 年前

    在编程语言概念中,

    西贝斯塔的书中指出(第九版,284年):

    固定堆动态数组的缺点是从堆栈分配数组需要较长的时间。

    我们如何分析这种说法?固定堆动态数组和堆动态数组的区别是什么?这个固定词代表什么?

    4 回复  |  直到 16 年前
        1
  •  6
  •   Mehrdad Afshari    16 年前

    从堆栈中分配内存非常简单。您只需要调整堆栈指针。在X64上,它是一条指令:

    sub rsp, size
    

    堆分配需要一些内存管理机制来查找足以容纳数组的块,选择块,将其标记为已分配到某个位置,并可能要求操作系统通过增加进程的地址空间来分配更多的内存页。它比基于堆栈的分配要复杂得多。

    重新“修复”,因为我没有这本书,我不知道它使用的上下文。这可能意味着数组在分配后不会在堆中移动。

        2
  •  2
  •   Norman Ramsey    16 年前

    来自Ergosys的答案的术语完全正确。这个问题是我为什么讨厌西贝斯塔的另一个例子。

    在许多现代系统中,从堆中分配对象使用与从堆栈中分配完全相同的指令:测试并增加堆指针。(事实上更容易 结合 堆栈分配大于组合堆分配,但也可以大于。)执行这种分配的编译器包括 Glorious Glasgow Haskell Compiler 和 Standard ML of New Jersey . SML/NJ已经在这种情况下部署了20多年,所以您认为Sebesta现在可能已经开始使用它了。

    总结: 塞贝斯塔太笼统了 ,像往常一样。也许有理由更喜欢堆栈分配,但是这个故事比Sebesta似乎意识到的要复杂得多,或者比Mehrdad在他的回答中描述的要复杂得多。一个很好的开始理解更深层次的故事的地方是 Andrew Appel's paper about stack allocation .

        3
  •  1
  •   djna    16 年前

    如果堆可以增长以适应每个新的分配,那么创建一个数组可能很快。如果堆是“固定的”,那么我们需要在堆中找到空间,正如Mehrdad解释的那样,这需要非常重要的工作。

    不过,我并不是很认真地分析句子的结尾:

    固定堆动态数组的缺点是它们分配数组的时间较长 从堆栈。

    当然,您不会“从堆栈”分配堆内存。

        4
  •  1
  •   ergosys    16 年前

    术语来自三个正交概念:

    • 数组的大小在初始分配后是否可以更改,或者永远保持相同的大小,“固定”。
    • 数组的位置:堆栈或堆内存。
    • 如果分配大小是在运行时“动态”或编译时确定的。