В чем преимущество unique_ptr перед shared_ptr - PullRequest
3 голосов
/ 30 сентября 2019

В настоящее время я изучаю типы unique_ptr и shared_ptr в C ++. Преимущества умных указателей над необработанными указателями очевидны, и есть много объяснений, почему вы должны предпочесть их перед необработанными указателями. Что я пытаюсь понять, так это , почему вы бы когда-нибудь специально решили использовать unique_ptr вместо shared_ptr?

Насколько я могу судить, с точки зрения программистов (игнорируя реализацию) , unique_ptr просто выглядит как специальная версия shared_ptr, где счетчик ссылок ограничен одним . Поэтому, если я создаю shared_ptr и создаю только одну ссылку, то у меня в основном есть полезность unique_ptr (с возможностью использовать деталь shared в будущем).

какое преимущество дает unique_ptr? Я должен признать, что подхожу к этому как программисту на Java, и shared_ptr кажется чертовски близко к тому, как работает Java.

1 Ответ

8 голосов
/ 30 сентября 2019

a unique_ptr просто выглядит как специальная версия shared_ptr, где счетчик ссылок ограничен одним

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

A unique_ptr, наоборот, является указателем без учета ссылок. Он может уйти, не имея счетчика ссылок, потому что его нельзя скопировать. Это означает, что в основном это абстракция с нулевой стоимостью для new и delete для указателя.

Итак, если вам никогда не нужно делиться собственностью, или вы можете просто перемещать его с места на место, и вы хотите самостоятельного управления, тогда вам нужен unique_ptr. Это охватывает подавляющее большинство случаев использования указателей. Когда вам действительно нужно совместное владение, вы можете использовать shared_ptr, но понимаете, что за такое совместное владение вы получаете штраф за производительность.

...