Что означает «одиночное распределение» для boost :: make_shared - PullRequest
9 голосов
/ 12 августа 2011

В расширенном документе make_shared написано:

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

Я не понимаю, что означает «однократное распределение», что это значит?

Ответы [ 2 ]

12 голосов
/ 12 августа 2011

«Выделение» означает блок памяти, полученный при обращении к распределителю.

Обычно, создание shared_ptr с помощью конструктора указателя выделяет память для «блока управления», который содержит ссылкупосчитай и удалитель.Копии этого shared_ptr все ссылаются на один и тот же блок управления, так что они совместно используют счетчик ссылок.Следовательно, всего существует два выделения - сам объект и управляющий блок, созданный shared_ptr.

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

  1. Управляемый объект
  2. Блок управления.
4 голосов
/ 12 августа 2011

shared_ptr необходимо выделить место для счетчика ссылок. Это означает, что вы будете динамически создавать свой объект (одно выделение) и передавать его в shared_ptr, который, в свою очередь, назначит счетчик (второе выделение). make_shared выполняет одиночное выделение достаточно большого размера, а затем создает на месте и счетчик, и объект.

...