什么时候深层复制发生在QList上?

时间:2011-07-28 21:48:54

标签: c++ qt qlist

在我正在研究的课程中,我正在处理几个QList的问题。我听说Qt试图尽可能不制作列表的深层副本。据我所知,这意味着当你这样做时不会发生深层复制:

QList<int> myList;
myList << 1 << 2 << 3 << 4;
QList<int> otherList = myList;  // No deep copy

在某些情况下,我需要确保QList永远不会发生深层复制。我需要确保避免哪种操作或操作,以确保我正在使用的QList不会发生深层复制?

3 个答案:

答案 0 :(得分:13)

QLists使用implicit sharing实现。

  

隐式共享对象的对象赋值(使用operator =())   使用浅拷贝实现。

这意味着单独分配永远不会导致包含的数据被复制。但是,写入共享实例会导致复制源对象。这种模式通常称为写时复制。

因此,要回答您的问题,如果您从未写过共享实例,那么它们将永远不会被复制。如果要完全阻止复制,则从QList派生并覆盖并隐藏复制构造函数和赋值运算符。

答案 1 :(得分:2)

当您将QList作为函数的参数传递时,或者在不修改它的情况下创建副本时,Qt只传递一个“包装器”,实际数据永远不会被复制。隐式共享是Flyweight模式的Qt实现,请参阅here

答案 2 :(得分:1)

请确保使用constBegin()constEnd(),通过const引用,不要修改或复制。