2009-08-14 3 views
8

Я получаю путать о конструктор копирования QList по documentation.Qt 4.5 - QList :: QList (const QList &) - это конструктор глубоких копий?

QList :: QList (Const QList & другой) Создаёт копию другого.

Эта операция занимает постоянное время, , потому что QList неявно разделяется. Это очень быстро возвращает QList из функции . Если общий экземпляр изменен, он будет скопирован (копирование на запись), и это займет линейное время.

Затем по ссылке о том, что он неявно используется, он говорит о подсчете ссылок и копировании на запись. Это глубокая копия или просто мелкая копия?

ответ

5

Это мелкая копия. Глубокая копия данных происходит за кулисами при первом вызове функции non-const в копии или в исходном списке.

+0

... или в оригинальном списке! В принципе, в любое время, когда данные списка будут изменены, создается глубокая копия. – Thomi

+0

О, конечно! Спасибо, я отредактировал свой ответ, чтобы избежать путаницы с теми, кто не читает комментарии. – rohanpm

+0

Просто хотел бы следить за тем, что я допустил ошибку - если у вас есть QList или QVector указателей, не ожидайте, что конструктор глубоких копий по умолчанию поможет вам создать новые экземпляры того, что указывают эти указатели ... – Extrakun

-2

AFAIK, при копировании содержимого (при записи) он вызывает конструктор копирования каждого элемента в списке, например, в случае std :: list.

3

Эта операция занимает постоянное время, , поскольку QList неявно используется совместно.

Если вы не изменяете этот список, они разделяют друг друга! Так что за сценой вы читаете по тому же адресу информацию!

Если общий экземпляр изменен, он будет скопирован (копирование при записи), и , что занимает линейное время.

Но если вы измените список копий, нет другого выбора, который бы эффективно копировал этот список! Итак, у вас есть линейная стоимость в зависимости от размера списка.

from qt doc on copy on write and shared memory :

Глубокое копирование подразумевает дублирование объекта. Неглубокая копия является ссылкой , то есть просто указателем на общий блок данных . Создание глубокой копии может быть дорогостоящим с точки зрения памяти и процессора. Выполнение мелкой копии происходит очень быстро, , поскольку она включает в себя установку указателя и приращение ссылки count.

Поэтому, если вы не изменяете список, вы читаете информацию по тому же адресу, что и список, указанный как параметр, он называется мелкой копией. И если вы измените его, у вас будет глубокая копия списка.

2

Конструктор копирования выполняет быструю (мелкую) копию. Если затем изменить либо исходный список, либо его копию, будет сделана глубокая копия данных.

Если у вас есть какие-либо сомнения, я предлагаю вам перечитать documetnation по семантике копирования на запись.

Это то же поведение, что и QString, QList, QArray и многие другие классы Qt.

 Смежные вопросы

  • Нет связанных вопросов^_^