MyTetra Share
Делитесь знаниями!
Что такое explicitly shared объекты и implicitly shared и чем они отличаются (краткое объяснение)
Время создания: 19.03.2016 10:47
Автор: Xintrea
Текстовые метки: C++, объект, explicitly, implicitly, shared, qt, совместное использование данных, разделяемые ресурсы, копирование
Раздел: Компьютер - Программирование - Язык C++ (Си++)
Запись: xintrea/mytetra_syncro/master/base/1458373634nx06pitouj/text.html на raw.github.com

Есть такое понятие - explicitly shared (явное совместное использование данных). Оно означает, что созданные копии объекта (с помощью конструктора копирования или оператором присваивания) ссылаются на одни и те же данные. Когда данные модифицируются с помощью одного объекта, изменения будут видны в другом.


Не следует путать явное совместное использование данных (explicitly shared) с неявным совместным использованием данных, именуемое в английской технической литературе как implicitly shared. Неявное совместное использование данных лишено вышеописанной проблемы, так как в своей основе имеет механизм "копирование при изменении" (copy-on-write).

Избежать проблемы совместного использования данных для объектов типа explicitly shared можно путем полного копирования объекта. Обычно такой метод называется copy() или clone().


Например, в Qt класс QDomNode создает explicitly shared объект. Его копирование через оператор = будет приводить только к тому, что вторая переменная будет работать с теми же данными что и первая. Для создания глубокой копии объекта класса QDomNode используется метод cloneNode().


А класс QMap, хоть и является контейнерным классом, но имеет конструкцию своего объекта как implicitly shared. И поэтому когда происходит присвоение QMap другой переменной, то обе переменные начинают работать с одними и теми же данными (поэтому присвоение быстрое). Но как только в одной из переменных начнется изменение данных, перед этим изменением произойдет полное копирование данных, и каждая переменная будет работать со своим набором данных.


Implicity share - это очень мощный и удобный механизм, позволяющий работать с большими объектами как с обычными переменными, передавая их по значению. Если объект не будет изменяться, то практически никакого оверхеда на работу c таким объектом нет. Если объект где-то изменяется, то надо понимать что в этот момент один раз произойдет копирование данных, чтобы переменная начала указывать на собственную копию данных. Но если окажется так, что больше никакие переменные кроме текущей к моменту изменения объекта не указывают на данный объект, то копирования данных не будет происходить, так как в этом случае это делать нет необходимости и изменения будут вноситься прямо в данные.


Так же в этом разделе:
 
MyTetra Share v.0.60
Яндекс индекс цитирования