堆与堆栈中动态数组分配的时间/空间权衡?

时间:2013-12-05 04:21:38

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

当我提出这个问题时,我一直在编写我的编程语言书(这些概念中的概念比我想象的要多得多):

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

在我看来,我认为在堆栈中进行分配时,它会占用更少的空间,但会占用更多的时间,而在堆中,需要更长的时间进行排序,但分配所需的大小更少?

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

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

@ingo是正确的。我还想补充一点,一般来说,堆的大小比堆栈大小大几个数量级。因此,当在一个空间中分配数组时,一个权衡就是数据可用的空间,例如,如果我必须创建一个300 Mb数组,那么堆可能是我最好的选择。

答案 2 :(得分:0)

对于空间:

通常,内存分配器会将所需的内存量进行四舍五入,以便进行对齐。

因此使用堆存在一些内存开销。有些编译器也可能对基于堆栈的数组做同样的事情。这一切都取决于细节。

时间:

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

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

再次,细节。