什么是更高效的堆栈内存或堆?

可能重复:
C ++更快:堆栈分配或堆分配

从内存分配角度来看什么更有效率 - 堆栈内存还是堆内存? 它取决于什么?

很显然,动态分配与堆栈上的分配有关。 使用堆涉及找到内存可以分配的位置和维护结构。 在堆栈中,它很简单,因为您已经知道放置元素的位置。 我想了解在允许动态分配的支持结构的最坏情况下以毫秒为单位的开销是多少?


堆栈通常速度更高效,并且易于实现!

我倾向于同意来自软件网站Joel的 Michael,他说,

在可能的情况下使用堆栈会更高效。

当你从堆中分配时,堆管理器必须经历有时是相对复杂的过程,以找到一块空闲的内存。 有时候,它必须环顾一下才能找到合适大小的东西。

这通常不是一个可怕的开销,但与栈的功能相比,这绝对是更复杂的工作。 当您使用堆栈中的内存时,编译器能够立即从堆栈声明一块内存来使用。 这基本上是一个更简单的过程。

然而,堆栈的大小是有限的,所以你不应该将它用于非常大的事情,如果你需要的东西大于4k左右的东西,那么你应该总是从堆中取而代之。

使用堆栈的另一个好处是它在当前函数退出时自动清理,您不必担心自己清理它。 你必须更加小心堆分配,以确保它们被清理。 使用处理自动删除堆分配的智能指针可以为此提供很多帮助。

我有点讨厌它,当我看到一些代码从堆中分配2个整数时,因为程序员需要一个指向2个整数的指针,当他们看到一个指针时,他们会自动假定他们需要使用这个堆。 我倾向于使用经验较少的编码器来看待这种情况 - 这是您应该使用堆栈的类型,并且只需在堆栈中声明2个整数的数组。

引用Joel on Software站点上的一个非常好的讨论:

堆栈与堆:更高的效率?


在堆栈上分配/释放更“高效”,因为它只涉及递增/递减堆栈指针,通常堆分配通常要复杂得多。 也就是说,在堆栈中放置大量内容通常不是一个好主意,因为堆栈空间远比大多数系统上的堆空间有限(特别是当涉及多个线程时,因为每个线程都有单独的堆栈)。


这两个内存区域针对不同的使用情况进行了优化。

该堆栈针对以FIFO顺序释放对象的情况进行了优化 - 也就是说,较新的对象始终在旧对象之前分配。 因此,只需维护一大堆字节,然后在最后交付或收回字节,就可以快速分配和解除分配内存。 因为存储函数调用的局部变量所需的内存总是以这种方式回收(因为函数总是以与调用它们相反的顺序完成执行),所以堆栈是分配这种内存的好地方。

但是,堆栈并不擅长其他类型的分配。 您不能轻松地释放分配给不是最近分配块的堆栈的内存,因为这会导致堆栈中存在“间隙”,并使确定字节可用位置的逻辑复杂化。 对于这种类型的分配,对象的生命周期不能根据分配对象的时间来确定,堆是存储事物的好地方。 实现这个堆的方法有很多,但其中大多数依赖于存储巨大表或链接列表的方式,这些方法的分配方式可以轻松地找到合适的内存块,以便将其交给客户端。 当内存被释放时,它会被重新添加到表或链接列表中,并且可能会应用其他逻辑来将这些块与其他块进行压缩。 由于搜索时间的这种开销,堆通常比堆栈慢得多。 然而,堆可以在堆栈通常并不擅长的模式中进行分配,因此这两者通常都存在于程序中。

有趣的是,还有一些其他分配内存的方法落在两者之间的某处。 一种常见的分配技术使用称为“竞技场”的东西,其中从堆中分配单个大块内存,然后将其分割成更小的块,如在堆栈中。 如果分配是连续的(例如,如果要分配大量小物件,这些小物件都生活在相同长度中),但是这些对象可以超越任何特定的函数调用。 存在许多其他方法,这只是可能的一小部分,但它应该清楚地表明内存分配完全是关于权衡。 你只需要找到一个适合你特定需求的分配器。

链接地址: http://www.djcxy.com/p/13875.html

上一篇: What is more efficient stack memory or heap?

下一篇: Allocation of the Stack memory in .NET