我有一个对象(A),其中包含由对象(B)组成的列表。列表中的对象(B)是指针,但是列表本身应该是指针吗?我正在从Java迁移到C ++,还没有完全习惯堆栈/堆。列表不会传递到类A之外,只有列表中的元素。为了保险起见,将列表本身分配在堆上是否是良好的做法?
此外,包含列表(A)的类本身也应该在堆上吗?就像列表一样,它也不会被传递。
此外,包含列表(A)的类本身也应该在堆上吗?就像列表一样,它也不会被传递。
如果列表可以增长,那么最好将其存储在堆上。因为您永远不知道运行时堆栈会是什么样子,溢出是一个真正的危险,后果是致命的。
如果您绝对知道列表的上限,并且与您的堆栈大小相比很小,那么您可能可以使用堆栈分配列表。
我在工作环境中经常需要处理堆栈大小较小且需要避免堆碎片的情况,因此我会使用以下规则:
如果列表很小且大小已知,则使用堆栈。
如果列表很小但大小未知,则可以考虑使用堆和alloca()。如果您能够保证在分配期间函数不会在堆上分配任何内容,则使用堆是一个不错的选择。如果无法保证这一点,则可能会导致碎片,此时使用alloca()将是更好的选择。
如果列表很大或需要增长,则使用堆。如果无法保证它不会产生碎片,我们通常会在内存管理器中构建一些资源来解决这个问题,例如自顶向下的分配和单独的堆。
大多数情况下,人们不需要担心碎片问题,因此他们可能不建议使用alloca。
关于包含列表的类,如果它仅在函数范围内使用,且内部数据结构不是非常大,我会将其放在堆栈上。
“list”是什么意思?如果它是std::list(或std::vector或任何其他STL容器),那么它不会在堆栈上存储任何东西,所以不用担心。
如果你有任何疑问,请查看sizeof(A),这将告诉你它在堆栈上使用多少内存。
但是...决策主要应基于对象的生命周期。基于堆栈的对象在超出范围时立即被销毁。
栈始终是最简单的。不幸的是,它有一个很大的缺点 - 你必须提前知道元素的数量。