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


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

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

在某些情况下,我需要确保永远不会发生深层复制 QList。确切地说,我需要确保避免哪种操作或操作,以确保永远不会发生深层复制 QList 我在和谁合作?


6503
2017-07-28 21:48


起源



答案:


QLists是使用 隐性共享

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

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

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


13
2017-07-28 22:00





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


2
2017-07-29 01:15





只要确保使用 constBegin()constEnd(), 经过 const 参考,不要修改或复制。


1
2017-07-14 15:45