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