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