什么时候对QList进行深度复制?
When does a deep copy happen to a QList?
在我正在学习的课程中,我正在处理几个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
引用,不要修改或复制
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- C++尝试深度复制唯一指针时出现内存访问冲突
- 在 c++ 中使用深度复制的运算符重载
- 如何深度复制链表对象指针
- 我有两棵二叉树.我想在不更改输入树的情况下深度复制两个二叉树的结果
- 如何将结构深度复制到向量的每个元素
- 我需要做一个深度复制,我是否正确使用了我的复制构造函数?
- 是否可以在不显式迭代每个元素的情况下深度复制指针容器?
- 如何深度复制unique_ptr向量
- 二叉搜索树 深度复制和取消引用
- 链表的这个别名运算符是否会产生深度复制
- 有没有一种 stl 方法来执行指针向量的深度复制
- cv::P oint3f 赋值运算符是否执行"深度"复制?
- Qt:通过深度复制访问列表中的数据结构是否应该比通过指针访问它慢得多
- 深度复制包含引用成员(C++)的结构
- 如何将“char *”深度复制到std::stringstream
- 如何在双向链表上执行深度复制
- 在复制构造函数中执行深度复制
- 深度复制cv::垫子替代品,哪个更好?
- 在 C/C++ 中使用 ProtoBuf 进行深度复制