可能重复:
C++ Which is faster: Stack allocation or Heap allocation什么是更高效的堆栈内存或堆?
什么是内存分配的角度更有效 - 栈内存或堆内存?它取决于什么?
很显然,动态分配的开销与堆栈上的分配有关。使用堆涉及找到可以分配内存的位置并维护结构。在堆栈中,它很简单,因为您已经知道放置元素的位置。我想了解在允许动态分配的支持结构的最坏情况下以毫秒为单位的开销是多少?
可能重复:
C++ Which is faster: Stack allocation or Heap allocation什么是更高效的堆栈内存或堆?
什么是内存分配的角度更有效 - 栈内存或堆内存?它取决于什么?
很显然,动态分配的开销与堆栈上的分配有关。使用堆涉及找到可以分配内存的位置并维护结构。在堆栈中,它很简单,因为您已经知道放置元素的位置。我想了解在允许动态分配的支持结构的最坏情况下以毫秒为单位的开销是多少?
堆栈通常速度更高效,实现起来很简单!
我倾向于从乔尔与迈克尔同意在软件网站,谁说,
更有效地使用堆栈 当它是可能的。
当你从堆中分配的 堆管理器要经过什么 有时一个相对复杂的过程 ,找到 内存空闲块。有时它必须在 附近找到合适大小的 。
这通常不是一个可怕的数额 的开销,但它肯定比 如何运作的功能更复杂的工作 。当你使用栈内存储器时,编译器能够立即从栈中索取一块内存块 以供使用。它基本上是一个更简单的程序。
然而,堆栈的大小是 有限的,所以你不应该使用它的 非常大的事情,如果你需要的东西 是大于 像4K左右,那么你应该 总是抢取而代之的是从堆 。
使用堆栈的另一个好处是 它自动清理 当电流函数退出,你 不必担心自己清洗它 。你必须小心谨慎地使用堆分配,以确保 确信它们已被清理。使用 智能指针,处理 自动删除堆 分配可以帮助很多与此。
我有点讨厌它,当我看到代码, 做的东西像分配2个整数 离堆,因为程序员 需要一个指针,2个整数和 当他们看到一个指针,他们只是 自然而然地认为他们需要到 使用堆。我倾向于看到 经验丰富的编码器有点 - 这是 应该使用堆栈并且只有 在 堆栈上声明的2个整数的数组类型。
在乔尔从一个很好的讨论,挂牌公告的软件网站:
在堆栈上分配/释放更“高效”,因为它只涉及递增/递减堆栈指针,通常堆分配通常要复杂得多。也就是说,在堆栈中放置大量内容通常不是一个好主意,因为堆栈空间远比大多数系统上的堆空间有限(特别是当涉及多个线程时,因为每个线程都有单独的堆栈)。
堆栈效率更高,但大小有限。我认为它就像1MByte。
当在堆上分配内存时,请记住数字1000.在堆上分配比在堆上慢1000倍。
的内存这两个地区是不同的使用情况进行了优化。
该堆栈针对以FIFO顺序释放对象的情况进行了优化 - 也就是说,较新的对象始终在旧对象之前分配。因此,只需维护一大堆字节,然后在最后交付或收回字节,就可以快速分配和解除分配内存。因为存储函数调用的局部变量所需的内存总是以这种方式回收(因为函数总是以与调用它们相反的顺序完成执行),所以堆栈是分配这种内存的好地方。
但是,堆栈并不擅长进行其他类型的分配。您不能轻松地释放分配给不是最近分配块的堆栈的内存,因为这会导致堆栈中存在“间隙”,并使确定字节可用位置的逻辑复杂化。对于这种类型的分配,对象的生命周期不能根据分配对象的时间来确定,堆是存储事物的好地方。实现这个堆的方法有很多,但其中大多数依赖于存储巨大表或链接列表的方式,这些方法的分配方式可以轻松地找到合适的内存块,以便将其交给客户端。当内存被释放时,它会被重新添加到表或链接列表中,并且可能会应用其他逻辑来将这些块与其他块进行压缩。由于搜索时间的这种开销,堆通常比堆栈慢得多。然而,堆可以在堆栈通常并不擅长的模式中进行分配,因此这两者通常都存在于程序中。
有趣的是,还有一些其他分配内存的方式落在两者之间。一种常见的分配技术使用称为“竞技场”的东西,其中从堆中分配单个大块内存,然后将其分割成更小的块,如在堆栈中。如果分配是连续的(例如,如果要分配大量小物件,这些小物件都生活在相同长度中),但是这些对象可以超越任何特定的函数调用。存在许多其他方法,这只是可能的一小部分,但它应该清楚地表明内存分配完全是关于权衡。你只需要找到一个适合你特定需求的分配器。
为什么高效? – Anycorn 2011-02-11 22:17:35
这取决于..... – 2011-02-11 22:17:47
投票结束为NARQ。 – 2011-02-11 22:20:34