intrusive_ptr: Почему общий базовый класс не обеспечивается?

boost::intrusive_ptr требует intrusive_ptr_add_ref и intrusive_ptr_release быть определенным. Почему базовый класс не обеспечивается, который сделает это? Здесь существует пример: в http://lists.boost.org/Archives/boost/2004/06/66957.php, но плакате говорится, что "Я не обязательно думаю, что это - хорошая идея". Почему нет?

Обновление: Я не думаю то, что этот класс мог неправильно использоваться со Множественным наследованием, причина достаточно. Любой класс, который происходит из нескольких базовых классов с их собственным подсчетом ссылок, имел бы ту же проблему. Реализованы ли эти refcounts через базовый класс, или не не имеет никакого значения.

Я не думаю, что существует любая проблема с многопоточностью; boost::shared_ptr предлагает атомарный подсчет ссылок, и этот класс мог также.

8
задан Siu Ching Pong -Asuka Kenji- 16 March 2013 в 07:12
поделиться

2 ответа

Это сделано для того, чтобы вы могли использовать intrusive_ptr с классами, которые уже реализуют add и release.

4
ответ дан 5 December 2019 в 17:35
поделиться

Проблема будет связана с множественным наследованием. Если вы наследуете от двух объектов, реализующих эту базу, то у вас будет два счетчика для одного объекта... и это может привести к хаосу.

Таким образом, вам нужно сделать методы ptr_add и ptr_release виртуальными, чтобы производный класс мог реализовать переопределение для правильной синхронизации нескольких счетчиков одновременно... Некоторый штраф за производительность здесь, особенно потому, что в большинстве случаев это будет совершенно ненужным (не будет никакого переопределения), потому что это полезно только для множественного наследования, в конце концов.

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

Вы также добавляете беспорядок в класс, некоторые клиенты могут не нуждаться в подсчете ссылок в конце концов (если они создают объект на стеке).

Я думаю, это не очень хорошая идея ;)

3
ответ дан 5 December 2019 в 17:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: