在我正在研究的课程中,我正在处理几个QList
的问题。我听说Qt试图尽可能不制作列表的深层副本。据我所知,这意味着当你这样做时不会发生深层复制:
QList<int> myList;
myList << 1 << 2 << 3 << 4;
QList<int> otherList = myList; // No deep copy
在某些情况下,我需要确保QList
永远不会发生深层复制。我需要确保避免哪种操作或操作,以确保我正在使用的QList
不会发生深层复制?
答案 0 :(得分:13)
QLists使用implicit sharing实现。
隐式共享对象的对象赋值(使用operator =()) 使用浅拷贝实现。
这意味着单独分配永远不会导致包含的数据被复制。但是,写入共享实例将会导致复制源对象。这种模式通常称为写时复制。
因此,要回答您的问题,如果您从未写过共享实例,那么它们将永远不会被复制。如果要完全阻止复制,则从QList派生并覆盖并隐藏复制构造函数和赋值运算符。
答案 1 :(得分:2)
当您将QList作为函数的参数传递时,或者在不修改它的情况下创建副本时,Qt只传递一个“包装器”,实际数据永远不会被复制。隐式共享是Flyweight模式的Qt实现,请参阅here。
答案 2 :(得分:1)
请确保使用constBegin()
,constEnd()
,通过const
引用,不要修改或复制。