LINUX.ORG.RU

Неявное разделение данных

 ,


0

1

Вот реализация класса с неявным разделение данных. Если я все правильно понимаю то при ее выполнении во втором инициализированном классе должна хранится ссылка на данные первого класс. И еще вопрос такой адреса классов должны быть одинаковые или нет?

★★★★★

Вот реализация класса с неявным разделение данных.

Если ты имеешь в виду shallow copy - это не оно.

Если я все правильно понимаю то при ее выполнении во втором инициализированном классе должна хранится ссылка на данные первого класс.

Да. Только не ссылка, а указатель.

И еще вопрос такой адреса классов должны быть одинаковые или нет?

Адреса классов - это что такое? Адреса объектов одинаковыми не будут в общем случае.

И ещё неплохо бы оператор присваивания переопределять и деструкторы делать виртуальными.

schizoid ★★★
()
Ответ на: комментарий от schizoid

Мне нужна: Реализовать класс книга с разделяемыми данными, и стратегией копирования при изменении. Т.е. данные по книге хранятся где-то в памяти. При создании копии строки, копия лишь ссылается на данные. Только при изменении данных происходит реальное копирование данных.

Я так понимаю, данный вариант является решением этой задачи.

Licwin ★★★★★
() автор топика
Ответ на: комментарий от Licwin

Пардон, проглядел, что ты используешь QSharedDataPointer. Да, при его использовании будет происходить copy-on-write - то, что тебе нужно. В документации же есть пример, почти то же, что и у тебя.

schizoid ★★★
()

Копирующий конструктор Book лишний. В BookData вызовы QString::clear() лишние. Вообще примерно такой же эффект будет и без QSharedDataPointer, потому как QString уже и так CoW.

Dendy ★★★★★
()
5 декабря 2012 г.
Ответ на: комментарий от schizoid

Уважаемый, а не подскажите какой именно пример можно рассмотреть в QT для наглядного примера copy-on-write? Вроде просмотрел документацию - не нашел(

needteam
()
Ответ на: комментарий от needteam

В доке для QSharedDataPointer есть пример для класса Employee (объект с данными, соответственно, будет наследован от QSharedData). Собственно, неявное копирование на то и неявное, что прямо в коде его не видно - внутренности Qt делают это за программиста.

Конкретно, важна строчка из того же дока:

In a non-const member function of Employee, whenever the d pointer is dereferenced, QSharedDataPointer automatically calls detach() to ensure that the function operates on its own copy of the data.

Она и объясняет, как работает неявное копирование в Qt-классах. Проще говоря: как только указатель на данные будет разыменован не для чтения, а для записи, QSharedData производит явное копирование в новый объект, который и будет изменяться.

schizoid ★★★
()

там хранится QSharedDataPointer, который хранит в себе указатель на данные.

у классов адресов нет. адреса есть у объектов.

nanoolinux ★★★★
()
Ответ на: комментарий от schizoid

Ок понял, спасибо) А вот такой еще вопрос - где именно можно посмотреть реализацию COW в коде. Просто мне проще посмотреть исходник программы и разобраться в нем. По инету искал - честно слово не нашел( Может есть ссылка на исходник? Если вдруг есть, скинь пожалуйста - буду очень благодарен)

needteam
()
Ответ на: комментарий от needteam

Здесь есть пример реализации: https://en.wikibooks.org/wiki/More_C _Idioms/Copy-on-write

Сам исходник QSharedData: http://qt.gitorious.org/qt/qt/blobs/4.8/src/corelib/tools/qshareddata.h

Алгоритм проще некуда:

  • Указатель - умный, с подсчётом ссылок, чтобы клонировать объект только тогда, когда на него два или больше указателей.
  • При копировании/присваивании объекта копировать указатель, а не объект (и увеличить счётчик ссылок).
  • При разыменовании на чтение (const) - просто разыменовать указатель.
  • При разыменовании на запись (не const) - создать новый объект-копию и работать с копией. Функция detach().
schizoid ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.