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

Intrusive_ptr в С++ 11

Имеет ли С++ 11 что-то эквивалентное boost::intrusive_ptr?

Моя проблема в том, что у меня есть C-стиль интерфейса над моим кодом на С++. Обе стороны интерфейса могут использовать С++, но для обеспечения совместимости требуется интерфейс C. Я не могу использовать std::shared_ptr, потому что мне нужно управлять объектом с помощью двух (или более) интеллектуальных указателей. Я не могу найти решение с чем-то вроде boost::intrusive_ptr.

4b9b3361

Ответ 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() и другой указатель на "блок управления", который содержит количество ссылок и знает динамический тип принадлежащего ему объекта), поэтому имеет больший отпечаток, чем интрузивный указатель.