Ответ 1
Имеет ли С++ 11 что-то эквивалентное boost:: intrusive_ptr?
Нет.
Он имеет std::make_shared
, что означает, что std::shared_ptr
почти (см. примечание ниже) настолько же эффективен, как и интрузивный умный указатель, поскольку подсчет ссылок будет храниться рядом с памятью в самом объекте, улучшая локальность ссылки и кеша Применение. Он также предоставляет std::enable_shared_from_this
, который позволяет вам получить std::shared_ptr
, если у вас есть только встроенный указатель на объект, принадлежащий shared_ptr
, но это не позволяет вам управлять объектом с использованием различных типов интеллектуальных указателей.
shared_ptr
ожидает полной ответственности за управление объектом. Другой тип интеллектуального указателя может управлять только "сильным" refcount, а не "слабым" значением refcount, что позволило бы счетчикам выйти из синхронизации и разбить инварианты shared_ptr
.
Примечание. Использование make_shared
позволяет shared_ptr
быть почти таким же эффективным, как интрузивный указатель. Объект и информация подсчета ссылок могут быть выделены в одном блоке памяти, когда используется make_shared
, но все равно будет два подсчета ссылок (для "сильных" и "слабых" счетчиков), что не соответствует интрузивные указатели, поскольку они не поддерживают weak_ptr
. Кроме того, самому объекту shared_ptr
всегда приходится хранить два указателя (тот, который будет возвращен shared_ptr::get()
и другой указатель на "блок управления", который содержит количество ссылок и знает динамический тип принадлежащего ему объекта), поэтому имеет больший отпечаток, чем интрузивный указатель.