Подтвердить что ты не робот

Shared_ptr vs scoped_ptr

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

Спасибо!

4b9b3361

Ответ 1

shared_ptr более тяжелый, чем scoped_ptr. Он должен выделять и освобождать объект счетчика ссылок, а также управляемый объект, а также обрабатывать подсчет ссылок на потоки - на одной платформе, над которой я работал, это было значительным накладным расходами.

Мой совет (в общем) - использовать простейший объект, который соответствует вашим потребностям. Если вам нужен подсчет с подсчетом ссылок, используйте shared_ptr; если вам просто нужно автоматическое удаление, как только вы закончили с одной ссылкой, используйте scoped_ptr.

Ответ 2

Производительность - shared_ptr имеет большую функциональность, но также требует дополнительного распределения (она также больше, но это редко имеет значение).

[edit] Второе выделение можно избежать, используя make_shared, но затем weak_ptr будет удерживать все целые распределения даже после уничтожения объекта, что может быть проблемой для больших объектов.

Expresison of Intent, используя scoped_ptr, вы более четко указываете, что вы хотите сделать. (Если вам интересно - это хорошая вещь:)). Если вы сделаете это правильно, shared_ptr также укажет, что "этот объект предназначен для жизни за пределами этой области"

Ответ 3

Их назначение предназначено для разных целей, поэтому во многих случаях "shared_ptr vs scoped_ptr" не является вопросом вообще. Конечно, вы можете использовать shared_ptr, когда все, что вам нужно, - scoped_ptr. Но какой смысл? shared_ptr, скорее всего, немного больше накладных расходов со всеми включенными подсчетами ссылок.

Ответ 4

scoped_ptr работает намного быстрее от shared_ptr. Это правильно. shared_ptr всегда выделяйте память с помощью распределителя или распределителя по умолчанию.

Ответ 5

Scoped_ptr имеет мало общего с shared_ptr, weak_ptr или unique_ptr, потому что он делает только особый случай "подсчета ссылок". Это не то, что вам нужно очень часто в хорошо продуманном коде, но это хороший инструмент для доступности.

В принципе, scoped_ptr вообще не считается ссылкой. Скорее, это объект, который вы создаете в стеке (внутри локальной области), чтобы вы могли сделать что-то вроде этого:

  //Some enclosing scope- anything set off by "{}" or even a function:
   {
       scoped_ptr<MyObject> ptr = new MyObject( parameters...);
   } // When we hit this closing brace, "ptr" will delete the "MyObject" inside.

Вы склонны чаще видеть этот шаблон с помощью мьютексов и других примитивов синхронизации. Я могу объявить "AutoLock", который заблокирует мьютекс, переданный в него, затем разблокирует его, когда он удалит, чтобы превратить всю область "{}" в критический раздел.

Также обратите внимание, что "scoped_ptr" только когда-либо имеет смысл, когда вы не можете просто выполнить распределение старого стека, например "MyObject obj (params..)" по какой-то причине. В конце концов, то, что он делает, это позволить вам использовать объект, выделенный для кучи, как если бы он был одним из стека. Это, как правило, намного реже используется, чем подсчет ссылок shared_ptr и его кузенов.