在编程语言概念中,
Sebesta的书指出(第九版,284):
固定堆动态数组的缺点是它们需要更长的时间从堆栈中分配数组。
我们如何分析这个陈述?固定堆动态和堆动态数组之间有什么区别。这个固定词代表什么?
答案 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)
术语来自三个正交概念: