Выбор ответа Middle RAII и умные указатели обновлено

Цена unique_ptr

Вопрос

Почему std::unique_ptr<T> с удалителем по умолчанию называют абстракцией без накладных расходов?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Его размер равен сырому указателю, а код после оптимизации такой же. Удалитель по умолчанию пустой класс и не занимает места, поэтому sizeof(std::uniqueptr<T) == sizeof(T) в основных реализациях, а все операции встраиваются.

Варианты ответа

  1. Он хранит счётчик ссылок в самом объекте и не выделяет управляющий блок
  2. Его размер равен сырому указателю, а код после оптимизации такой жеправильный ответ
  3. Он не вызывает деструктор объекта, а только освобождает память
  4. Он размещает объект на стеке, поэтому не тратит время на аллокацию

Разбор

Удалитель по умолчанию пустой класс и не занимает места, поэтому sizeof(std::unique_ptr<T>) == sizeof(T*) в основных реализациях, а все операции встраиваются. Пользовательский удалитель-указатель на функцию увеличит размер.

  • Счётчиков у unique_ptr нет, это свойство shared_ptr (и он хранит их в управляющем блоке, а не в объекте).
  • Деструктор вызывается: в этом весь смысл.
  • Объект живёт там, где его создали, обычно в куче через make_unique.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.