a unique_ptr
просто выглядит как специальная версия shared_ptr
, где счетчик ссылок ограничен одним
Это не так, и сутьпочему вы бы использовали тот или иной. A shared_ptr
является указателем с подсчетом ссылок. Для того, чтобы он был потокобезопасным, он использует атомный счетчик для подсчета ссылок. Таким образом, это означает, что для shared_ptr
у вас есть дополнительные накладные расходы на хранение счетчика ссылок, плюс накладные расходы на выполнение проверки / манипулирования этим счетчиком во всех функциях, которые на него влияют. Эти издержки могут оказать заметное влияние на производительность
A unique_ptr
, наоборот, является указателем без учета ссылок. Он может уйти, не имея счетчика ссылок, потому что его нельзя скопировать. Это означает, что в основном это абстракция с нулевой стоимостью для new
и delete
для указателя.
Итак, если вам никогда не нужно делиться собственностью, или вы можете просто перемещать его с места на место, и вы хотите самостоятельного управления, тогда вам нужен unique_ptr
. Это охватывает подавляющее большинство случаев использования указателей. Когда вам действительно нужно совместное владение, вы можете использовать shared_ptr
, но понимаете, что за такое совместное владение вы получаете штраф за производительность.