当我提出这个问题时,我一直在编写我的编程语言书(这些概念中的概念比我想象的要多得多):
当动态数组的分配发生在运行时堆栈而不是堆中时,时间和空间的权衡是什么?
在我看来,我认为在堆栈中进行分配时,它会占用更少的空间,但会占用更多的时间,而在堆中,需要更长的时间进行排序,但分配所需的大小更少?
任何人都可以确认/破坏我的思维过程吗?
答案 0 :(得分:0)
很难理解为什么数组(或其他东西)应该使用更多或更少的空间,具体取决于分配内存的哪一部分。此外,除非以类似malloc的方式实现堆分配,否则分配只不过是修复起始地址和碰撞指针。
真正的权衡是创建的对象/数组的可能生命周期。虽然它可以比在堆上创建的函数/方法更长,但在堆栈分配时肯定不能。
您可以节省一些CPU周期的唯一一点是通过释放对象。当堆栈帧被丢弃时,堆栈对象不需要额外的努力就会消失。堆对象OTOH必须进行垃圾回收。
答案 1 :(得分:0)
@ingo是正确的。我还想补充一点,一般来说,堆的大小比堆栈大小大几个数量级。因此,当在一个空间中分配数组时,一个权衡就是数据可用的空间,例如,如果我必须创建一个300 Mb数组,那么堆可能是我最好的选择。
答案 2 :(得分:0)
对于空间:
通常,内存分配器会将所需的内存量进行四舍五入,以便进行对齐。
因此使用堆存在一些内存开销。有些编译器也可能对基于堆栈的数组做同样的事情。这一切都取决于细节。
时间:
内存分配器的时间开销可能很大。
对于基于堆栈的,通常会更改堆栈指针,这非常快。
再次,细节。