我有一个对象(A),它有一个由对象(B)组成的列表。列表(B)中的对象是指针,但列表本身应该是指针吗?我正在从Java迁移到C ++,但仍然没有完全习惯堆栈/堆。该列表不会在类A之外传递,只传递列表中的元素。为了以防万一,将列表本身分配在堆上是一种好习惯吗?
此外,包含列表(A)的类是否也应该在堆本身上?与列表一样,它不会被传递。
答案 0 :(得分:6)
请记住
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)
堆栈总是最简单的。不幸的是,它有一个很大的缺点 - 你必须提前知道元素的数量。