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

时间:2011-02-11 22:15:02

标签: c++ memory compiler-construction

  

可能重复:
  C++ Which is faster: Stack allocation or Heap allocation

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

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

4 个答案:

答案 0 :(得分:6)

堆栈通常在速度方面更有效,并且易于实现!

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

  

使用堆栈效率更高   什么时候可能。

     

从堆中分配时,   堆管理器必须经历的是什么   有时相对复杂   程序,找到一个免费的大块   记忆。有时它必须看   一点点找点东西   大小合适。

     

这通常不是很糟糕   开销,但肯定更多   复杂的工作相比如何堆栈   功能。当你使用内存时   堆栈,编译器能够   立即声称有一大块记忆   从堆栈中使用。它的   从根本上说这是一个更简单的程序。

     

但是,堆栈的大小是   有限,所以你不应该使用它   非常大的东西,如果你需要的话   比大于的东西   像4k左右的东西,然后你   应该总是从堆中抓取它   代替。

     

使用堆栈的另一个好处是   它被自动清理   当前函数退出时,你   不必担心清洁它   你自己。你必须做得更多   小心堆分配   确保他们被清理干净。运用   处理的智能指针   自动删除堆   分配可以帮助很多。

     当我看到代码时,我有点讨厌它   像分配2个整数那样的东西   从堆中因为程序员   需要一个指向2个整数的指针   当他们看到指针时他们就是   自动假设他们需要   使用堆。我倾向于看到这一点   有些经验不足的编码员 -   这是你的类型   应该使用堆栈,只是有   在...上声明的2个整数数组   叠加。

引自 Joel on Software 网站上的一次非常好的讨论:

stack versus heap: more efficiency?

答案 1 :(得分:4)

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

答案 2 :(得分:1)

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

堆栈针对以FIFO顺序释放对象的情况进行了优化 - 也就是说,较新的对象始终在较旧的对象之前分配。因此,通过简单地维护一个巨大的字节数组,然后在最后切换或缩回字节,可以快速分配和释放内存。因为存储函数调用的局部变量所需的内存总是以这种方式回收(因为函数总是按照它们被调用的相反顺序完成执行),所以堆栈是分配这种内存的好地方。 p>

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

有趣的是,还有其他一些分配内存的方法介于两者之间。一种常见的分配技术使用称为“竞技场”的东西,其中从堆中分配单个大块内存,然后将其分区为较小的块,如堆栈中。这样做的好处是,如果分配是顺序的,那么来自竞技场的分配非常快(例如,如果你要分配大量同样长度的小对象),但是对象可以比任何特定的函数调用寿命更长。存在许多其他方法,这只是可能的一小部分,但应该明确内存分配是关于权衡。您只需要找到一个适合您特定需求的分配器。

答案 3 :(得分:0)

堆栈效率更高,但尺寸有限。我认为这有点像1MByte。

在堆上分配内存时,我记住数字1000.在堆上分配比在堆栈上慢1000倍。

相关问题