Подтвердить что ты не робот

Когда происходит глубокая копия с QList?

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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