Как показано в коде здесь, размер объекта, возвращаемого из make_shared, является двумя указателями.
Однако почему make_shared
работает следующим образом (предположим, что T - это тип, которым мы располагаем общий указатель):
Результат
make_shared
- это указатель one, который указывает на выделенную память размеромsizeof(int) + sizeof(T)
, где int - счетчик ссылок, и это увеличивается и уменьшается на построение/уничтожение указателей.
unique_ptr
- это только размер одного указателя, поэтому я не уверен, почему для общего указателя нужны два. Насколько я могу судить, все, что ему нужно, - это счетчик ссылок, который с make_shared
может быть помещен вместе с самим объектом.
Кроме того, существует ли какая-либо реализация, которая реализована так, как я предлагаю (без необходимости обманывать intrusive_ptr
для определенных объектов)? Если нет, то почему я предлагаю исключение?