Подсчет ссылок make_shared () в C ++ - PullRequest
0 голосов
/ 09 октября 2018

От: Тур по C ++ (второе издание)

13.2.1 unique_ptr и shared_ptr

Использование make_shared () не просто более удобно, чемОтдельно создавая объект с использованием new, а затем передавая его в shared_ptr, он также заметно более эффективен , поскольку для него не требуется отдельное выделение для счетчика использования , что существенно для реализации shared_ptr .

Мой вопрос : почему shared_ptr нужно выделить память для подсчета ссылок и make_shared() нет?(Будет ли он выделяться только при наличии как минимум двух ссылок на данные?)

Редактировать: я не заметил слова "отдельный" в тексте, поэтому мой вопрос не имеет значения, жесткий - я бы хотелвсе еще хотел бы спросить, почему make_shared () более эффективен

1 Ответ

0 голосов
/ 09 октября 2018

Общий указатель состоит из двух частей: указатель на созданный вами «объект» и указатель на специальный блок управления, который содержит счетчик ссылок и, возможно, некоторые другие необходимые метаданные.

ЕслиВы создаете свой собственный объект std::shared_ptr, эти два блока памяти будут выделяться отдельно.Если вы используете std::make_shared, то функция будет выполнять только одно выделение для обоих блоков памяти.

...