什么时候对QList进行深度复制?

When does a deep copy happen to a QList?

本文关键字:深度 复制 QList 什么时候      更新时间:2023-10-16

在我正在学习的课程中,我正在处理几个QList。我听说Qt在任何可能的情况下都不会对列表进行深度复制。根据我的理解,这意味着当您执行以下操作时不会发生深度复制:

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

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

qlist使用隐式共享实现。

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

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

所以,回答你的问题,如果你从不写共享实例,那么它们将永远不会被复制。如果你想完全防止复制,那么从QList派生并覆盖并隐藏复制构造函数和赋值操作符。

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

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