当堆中分配的对象变大时会发生啥?
Posted
技术标签:
【中文标题】当堆中分配的对象变大时会发生啥?【英文标题】:What happens when an object allocated in the heap gets larger?当堆中分配的对象变大时会发生什么? 【发布时间】:2013-02-14 21:00:47 【问题描述】:假设我有一个名为的成员变量 结果m_result
class Result
QList<Group *> m_groups
和组
class Group
QList<Data> m_data
随着程序的继续,每个组的 QList of Data 不断增长。所有组都分配在堆中(因此是指针)。本质上,每个组都在堆中分配一次。每次 QList 增长时,是否都会重新分配特定组?另外,m_testResult 是否会因为 Data 成员的增长而被一遍又一遍地复制?
【问题讨论】:
简答:没有和没有。 您缺少一些代码,m_testResult
不在您的示例中
【参考方案1】:
在 QList 内部,会有指向其他一些实际保存数据的对象或数组的指针。随着列表的增长,将分配此支持数据的新对象并删除现有对象。您显示的代码不必担心它,但是如果您要实现自己的集合,那么您会的。对象本身一旦被分配就永远不会增长。
QList 的详细信息可以在here 中找到——它使用指向<T>
的指针数组,因此不是链表。由于它使用指向元素的指针,因此在调整数组大小时不必复制元素,只需复制指针(或者如果它以与VList 类似的方式实现,则可能不需要 - 我在文档以指示它使用哪种策略),因此特定组不会在其 QList 每次增长时重新分配。
【讨论】:
【参考方案2】:我不知道特别是 QList
,但总的来说,我会期待以下内容:
添加新元素后,QList
分配 (new
) 更多内存并将最后一个元素链接到新元素。
删除(现有)元素后,该元素的前任将链接到其后继元素,保存该元素的内存为delete
-ed。
这是任何链表如何工作的一般原则,例如std::list
或std::slist
对象永远不会增长,但内存可以反复声明和释放。
【讨论】:
以上是关于当堆中分配的对象变大时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章