В течение последних нескольких лет я обычно принимал, что
если я собираюсь использовать интеллектуальные указатели ref-counted
инвазивные интеллектуальные указатели - это путь
-
Однако я начинаю любить неинвазивные умные указатели из-за следующего:
- Я использую только интеллектуальные указатели (так что Foo * не лежит вокруг, а только Ptr)
- Я начинаю создавать пользовательские распределители для каждого класса. (Таким образом, Foo перегрузит новый оператор).
- Теперь, если Foo имеет список всех Ptr (как легко это сделать с неинвазивными интеллектуальными указателями).
- Тогда я могу избежать проблем с фрагментацией памяти, так как класс Foo перемещает объекты вокруг (и просто обновляет соответствующий Ptr).
Единственная причина, по которой эти движущиеся объекты Foo в неинвазивных интеллектуальных указателях проще, чем инвазивные интеллектуальные указатели:
В неинвазивных интеллектуальных указателях есть только один указатель, указывающий на каждый Foo.
В инвазивных интеллектуальных указателях я понятия не имею, сколько объектов указывает на каждый Foo.
Теперь единственная стоимость неинвазивных интеллектуальных указателей... - это двойная косвенность. [Возможно, это закручивает кеши).
Есть ли у кого-нибудь хорошее изучение дорогого этого дополнительного слоя косвенности?
EDIT: с помощью интеллектуальных указателей я могу ссылаться на то, что другие называют "shared-pointers"; вся идея такова: есть счетчик ссылок, прикрепленный к объектам, и когда он достигает 0, объект автоматически удаляется