之间的表现。堆栈堆动态数组

时间:2010-01-08 07:44:25

标签: memory-management programming-languages

在编程语言概念中,

Sebesta的书指出(第九版,284):

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

我们如何分析这个陈述?固定堆动态和堆动态数组之间有什么区别。这个固定词代表什么?

4 个答案:

答案 0 :(得分:6)

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

sub rsp, size

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

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

答案 1 :(得分:2)

ergosys的答案完全正确。问题是我讨厌Sebesta的另一个例子。

在许多现代系统中,从堆中分配对象使用与从堆栈分配完全相同的指令:测试并递增堆指针。 (确实,组合堆栈分配比组合堆分配更容易,但也可以这样做。)执行此类分配的编译器包括Glorious Glasgow Haskell Compiler和{{ 3}}。 SML / NJ已经在这种情况下部署了20多年,所以你认为Sebesta现在可能已经接受了它。

摘要:像往常一样, Sebesta过度概括。可能有理由更喜欢堆栈分配,但这个故事远比Sebesta似乎意识到的要复杂得多,或者比Mehrdad在他的回答中描述的要复杂得多。开始理解更深层次故事的好地方是Standard ML of New Jersey

答案 2 :(得分:1)

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

我并不完全解析句子的结尾:

固定堆动态数组的缺点是它们需要更长的时间从堆栈中分配数组

你肯定不会“从堆栈中”分配堆内存。

答案 3 :(得分:1)

术语来自三个正交概念:

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