make_shared более эффективен, чем отдельный вызов new и создает shared_ptr, потому что make_shared выделяет пространство для подсчета ссылок и слабого подсчета в том же блоке памяти, что и экземпляр объекта клиента (эффективно давая shared_ptr большинство преимуществ производительности intrusive_ptr).
enable_shared_from_this дает общий указатель без ссылки на какой-либо общий указатель. Поэтому такие вещи, как ссылочный и слабый счет, должны быть как-то доступны изнутри клиентского объекта. Поэтому было бы разумно, чтобы enable_shared_from_this вызывал интрузивный счет, похожий на make_shared.
Однако я понятия не имею, как что-то подобное может быть реализовано (и я не уверен, что буду следить за тем, что происходит там, даже если я смотрю на фактический источник).
Будет ли смысл тогда (по соображениям производительности) отмечать мой класс enable_shared_from_this, если я знаю, что он когда-либо будет использоваться как shared_ptr и никогда не будет как необработанный объект?