Когда происходит глубокая копия с QList?
В классе, над которым я работаю, я жонглирую несколько QList
s. Я слышал, что Qt пытается по возможности не делать глубоких копий списков. Из того, что я понимаю, это означает, что никакая глубокая копия не происходит, когда вы это делаете:
QList<int> myList;
myList << 1 << 2 << 3 << 4;
QList<int> otherList = myList; // No deep copy
В некоторых случаях мне нужно убедиться, что глубокая копия никогда не происходит с QList
. Точно, какую операцию или действие нужно сделать, чтобы избежать, чтобы убедиться, что глубокая копия никогда не происходит с QList
, с которой я работаю?
Ответы
Ответ 1
QLists реализованы с использованием неявного обмена.
Назначение объекта (с оператором =()) для неявно разделяемых объектов с использованием мелких копий.
Это означает, что само присваивание никогда не приведет к копированию содержащихся данных. Однако запись в общий экземпляр будет заставлять копировать исходный объект. Этот шаблон обычно известен как copy-on-write.
Итак, чтобы ответить на ваш вопрос, если вы никогда не пишете в общие экземпляры, они никогда не будут скопированы. Если вы хотите полностью предотвратить создание копий, выведите из QList и переопределите и скройте конструктор копирования и оператор присваивания.
Ответ 2
Когда вы передаете QList в качестве аргумента функции или когда вы создаете копии без изменения, Qt просто передает "обертку", реальные данные никогда не копируются. Неявное совместное использование - это реализация Qt шаблона Flyweight, см. здесь.
Ответ 3
Просто используйте constBegin()
, constEnd()
, передайте ссылку const
, не изменяйте и не копируйте.