Когда происходит глубокая копия QList? - PullRequest
11 голосов
/ 29 июля 2011

В классе, над которым я работаю, я жонглирую несколькими QList с.Я слышал, что Qt старается не делать глубоких копий списков, когда это возможно.Из того, что я понимаю, это означает, что при этом не происходит глубокого копирования:

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

В некоторых случаях мне нужно убедиться, что глубокое копирование никогда не произойдет с QList.Какой именно тип операции или действия мне нужно избегать, чтобы исключить возможность глубокого копирования с QList, с которым я работаю?

Ответы [ 3 ]

13 голосов
/ 29 июля 2011

QLists реализованы с использованием неявного совместного использования .

Назначение объекта (с оператором = ()) для неявно разделяемых объектов: реализовано с использованием мелких копий.

Это означает, что одно только назначение никогда не приведет к копированию содержащихся данных. Однако запись в общий экземпляр вызовет , что приведет к копированию исходного объекта. Этот шаблон широко известен как копирование при записи.

Итак, чтобы ответить на ваш вопрос, если вы никогда не будете писать в общие экземпляры, они никогда не будут скопированы. Если вы хотите полностью запретить создание копий, наследуйте от QList и переопределите и скрывайте конструктор копирования и оператор присваивания.

2 голосов
/ 29 июля 2011

Когда вы передаете QList в качестве аргумента функции или когда вы создаете копии, не изменяя его, Qt просто передает «обертку», реальные данные никогда не копируются. Неявное совместное использование - реализация Qt шаблона Flyweight, см. здесь .

1 голос
/ 14 июля 2015

Просто убедитесь, что вы используете constBegin(), constEnd(), передайте ссылку const, не изменяйте и не копируйте.

...