对象列表是应该存储在堆还是堆栈上?

时间:2009-03-15 01:46:02

标签: c++ memory-management object stack heap

我有一个对象(A),它有一个由对象(B)组成的列表。列表(B)中的对象是指针,但列表本身应该是指针吗?我正在从Java迁移到C ++,但仍然没有完全习惯堆栈/堆。该列表不会在类A之外传递,只传递列表中的元素。为了以防万一,将列表本身分配在堆上是一种好习惯吗?

此外,包含列表(A)的类是否也应该在堆本身上?与列表一样,它不会被传递。

5 个答案:

答案 0 :(得分:6)

请记住

  1. 如果Object-A也在堆栈上,列表将只在堆栈上
  2. 即使列表本身不在堆上,它也可以从堆中分配其存储。这就是std :: list,std :: vector和大多数C ++列表的工作方式 - 原因是基于堆栈的元素无法增长。
  3. 这些天大多数堆都在1mb左右,所以在需要担心它之前,你需要一个相当大的大型对象列表。即使你的堆栈只有大约32kb,你也可以存储近八千个指针。
  4. IMO人员对C / C ++中的显式内存管理不熟悉,可能会倾向于过度思考这些内容。

    除非你正在写一些你知道会有数千个相当大的对象的东西,否则只需将列表放在堆栈上即可。除非你在一个函数中使用巨型C风格的数组,否则由于上面的#1和#2,列表中使用的内存最终会在堆中结束。

答案 1 :(得分:1)

最好在堆上存储列表(如果它可以增长)。由于你永远不知道运行时堆栈是什么,溢出是一个真正的危险,后果是致命的。

如果您完全知道列表的上限,并且它与堆栈的大小相比较小,那么您可以放弃使用堆栈分配列表。

答案 2 :(得分:0)

我在堆栈很小的环境中工作,需要避免堆碎片,所以我会使用这些规则:

  • 如果列表很小并且已知固定大小,则为堆栈。

  • 如果列表很小且未知的固定大小,您可以同时考虑堆和alloca()。如果你可以保证你的函数在你的分配期间没有在堆上分配任何东西,那么使用堆将是一个很好的选择。如果您不能保证这一点,那么您需要一个片段,而alloca()将是更好的选择。

  • 如果列表很大或需要增长,请使用堆。如果你不能保证它不会碎片化,我们倾向于在内存管理器中加入一些资源,如自上而下的分配和单独的堆。

大多数情况并不要求人们担心碎片,在这种情况下他们可能不会建议使用alloca。

关于包含列表的类,如果它是函数作用域的本地,我会把它放在堆栈上,前提是内部数据结构不是很大。

答案 3 :(得分:0)

“list”是什么意思?如果它是std :: list(或std :: vector或任何其他STL容器),那么它不会在堆栈中存储任何东西,所以不要担心。

如果您有任何疑问,请查看sizeof(A)并告诉您它在堆栈中将使用多少内存。

但是......决定应该主要基于对象的生命周期。基于堆栈的对象一旦超出范围就会被销毁。

答案 4 :(得分:-1)

堆栈总是最简单的。不幸的是,它有一个很大的缺点 - 你必须提前知道元素的数量。