new и make_shared для общих указателей

Я наткнулсяэтот сообщение и один из ответов @kerek SB говорится

std::shared_ptr<Object> p1 = std::make_shared<Object>("foo");
std::shared_ptr<Object> p2(new Object("foo"));

В вашем коде вторая переменная - это просто пустой указатель, а не общий указатель вообще.

Теперь о мясе. make_shared (на практике) более эффективен, поскольку он выделяет эталонный блок управления вместе с реальным объектом в одном динамическом выделении. Напротив, конструктор для shared_ptr, который принимает указатель на обнаженный объект, должен выделить другую динамическую переменную для счетчика ссылок. Компромисс состоит в том, что make_shared (или его двоюродный брат allocate_shared) не позволяет вам указать пользовательское средство удаления, так как распределение выполняется распределителем.

(Это не влияет на конструирование самого объекта. С точки зрения объекта нет никакой разницы между двумя версиями. Более эффективен сам указатель общего доступа, а не управляемый объект.)

Теперь у меня есть два вопроса относительно этого поста, и я был бы признателен, если бы кто-то смог уточнить это

Почему второй не является общим указателем? Разве это не увеличивает счетчик ссылок?

Как make_shared делает только одно выделение памяти, а new делает два, тем самым делая make_shared более эффективным?

Небольшое разъяснение по этому вопросу будет оценено.

Ответы на вопрос(4)

Ваш ответ на вопрос