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

Что такое неявное совместное использование?

Я создаю библиотеку движков игр на С++. Некоторое время назад я использовал Qt для создания приложения и был довольно очарован использованием Неявного обмена. Мне интересно, может ли кто-нибудь объяснить эту технику более подробно или может предложить простой пример этого в действии.

4b9b3361

Ответ 1

Основная идея неявного совместного использования, похоже, идет вокруг, используя более распространенный термин copy-on-write. Идея копирования-на-записи состоит в том, чтобы каждый объект служил оберткой вокруг указателя на фактическую реализацию. Каждый объект реализации отслеживает количество указателей в нем. Всякий раз, когда операция выполняется над объектом-оболочкой, она просто перенаправляется на объект реализации, который выполняет фактическую работу.

Преимущество такого подхода заключается в том, что копирование и уничтожение этих объектов дешево. Чтобы сделать копию объекта, мы просто создаем новый экземпляр оболочки, устанавливаем его указатель на объект реализации, а затем увеличиваем количество указателей на объект (это иногда называют счетчиком ссылок, Кстати). Уничтожение похоже - мы отбрасываем количество ссылок на единицу, а затем видим, указывает ли кто-нибудь еще на реализацию. Если нет, мы освобождаем его ресурсы. В противном случае мы ничего не делаем и просто предположим, что кто-то еще сделает очистку позже.

Задача в этом подходе состоит в том, что это означает, что несколько разных объектов будут указывать на одну и ту же реализацию. Это означает, что если кто-то закончит внесение изменений в реализацию, каждый объект, ссылающийся на эту реализацию, увидит изменения - очень серьезную проблему. Чтобы исправить это, каждый раз, когда выполняется операция, которая может потенциально изменить реализацию, операция проверяет, ссылаются ли какие-либо другие объекты на реализацию, если счетчик ссылок идентичен 1. Если никакие другие объекты не ссылаются на объект, операция может просто идти вперед - нет возможности распространения изменений. Если есть хотя бы один объект, ссылающийся на данные, тогда оболочка сначала делает глубокую копию реализации для себя и меняет свой указатель на то, чтобы указать на новый объект. Теперь мы знаем, что не может быть никакого обмена, и изменения могут быть сделаны без хлопот.

Если вы хотите увидеть некоторые примеры этого в действии, взгляните на примеры лекций 15.0 и 16.0 из Стэнфордский вводный курс программирования на C++. Он показывает, как создать объект для хранения списка слов, используя эту технику.

Надеюсь, это поможет!