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
и никогда не будет как необработанный объект?