Должен ли я переключиться с использования boost::shared ptr на std::shared ptr?


Я хотел бы включить поддержку C++0x в GCC с -std=c++0x. Мне абсолютно не обязательно нужен какой-либо из в настоящее время поддерживаются функции C++11 в GCC 4.5 (и вскоре 4.6), но я хотел бы начать привыкать к ним. Например, в нескольких местах, где я использую итераторы,auto тип было бы полезно.

но опять же, я не нужно любой из поддерживаемых в настоящее время функций. Цель здесь состоит в том, чтобы побудить меня включить функции новый стандарт в моей программной "лексике".

из того, что вы знаете о поддержке C++11, хорошо ли включить ее в GCC, а затем принять ее, например, переключившись с использования boost::shared_ptr до std::shared_ptr исключительно как два не смешиваются?

PS: Я знаю об этом хорошем вопросе, который сравнивает разные вкусы shared_ptr но я прошу совет более высокого уровня, на котором использовать до завершения стандарта. Другой способ положить это, когда компилятор как GCC говорит, что он поддерживает "экспериментальную функцию", означает ли это, что я, вероятно, столкнусь с странными ошибками во время компиляции, которые будут основными временными потоками и источником загадочных вопросов о StackOverflow?

Edit: я решил переключиться обратно с std::shared_ptr потому что я просто не доверяю свою поддержку в GCC 4.5, как показано на примере в этом вопросе.

8 64

8 ответов:

есть несколько причин, чтобы переключиться на std::shared_ptr:

  • вы удаляете зависимость от Boost.
  • Отладчики. В зависимости от вашего компилятора и отладчика, отладчик может быть" умным " о std::shared_ptr и показать указал на объект непосредственно, где это не было бы, скажем, реализация boost. По крайней мере, в Visual Studio,std::shared_ptr выглядит как обычный указатель в отладчике, в то время как boost::shared_ptr выставляет кучу бустов внутренности.
  • другие новые функции, определенные в вашем связанном вопросе.
  • вы получаете реализацию, которая почти гарантированно будет включена семантика перемещения, что может сэкономить несколько модификаций refcount. (Теоретически, я не проверял это сам) по состоянию на 2014-07-22, по крайней мере, boost::shared_ptr понимает семантику перемещения.
  • std::shared_ptr правильно использует delete [] на типы массивов, в то время как boost::shared_ptr вызывает неопределенное поведение в таких случаях (вы должны используйте shared_array или пользовательским deleter) (на самом деле я исправляюсь. Смотрите этой -- специализация для этого для unique_ptr, а не shared_ptr.)

и одна главная вопиющая причина не делать этого:

  • вы бы ограничились компилятором C++11 и стандартными реализациями библиотек.

наконец, вам действительно не нужно выбирать. (И если вы нацелены на определенную серию компиляторов (например, MSVC и GCC), вы можете легко распространить этот контент, чтобы использовать std::tr1::shared_ptr при наличии. К сожалению, не существует стандартного способа обнаружения поддержки TR1)

#if __cplusplus > 199711L
#include <memory>
namespace MyProject
{
    using std::shared_ptr;
}
#else
#include <boost/shared_ptr.hpp>
namespace MyProject
{
    using boost::shared_ptr;
}
#endif

Я полагаю, это зависит от того, сколько вы используете boost. Я лично использую его очень экономно (на самом деле библиотека случайных чисел, в одном проекте). Я недавно начал использовать -std=c++0x для других моих проектов, и я использую новые функции std:: library, такие как shared_ptr в них. Мне нравится, что мои проекты имеют минимум зависимостей, поэтому я бы предпочел зависеть от реализации стандартной библиотеки компилятора, чем от boost.

но я не думаю, что есть один-размер-подходит-всем ответить на этот вопрос.

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

вероятно, неплохо начать привыкать использовать std:: shared_ptr, когда это разрешено компилятором. Поскольку интерфейс такой же, как у shared_ptr boost, вы всегда можете переключиться обратно, если вам это нужно.

Если вы просто строите на одной платформе, это нормально (сделайте переключатель)
(Примечание: у вас есть модульные тесты для проверки обратной совместимости нет?)

Если вы компилируете на нескольких платформах, это становится немного более неудобным, поскольку вам нужно проверить, что функции на g++ 4.5 доступны на всех платформах, которые вы используете (т. е. создание для MAC/Linux компилятор Mac g++ по умолчанию все еще находится на пару версий позади компиляторов по умолчанию в Linux).

еще одна причина переключиться на std::shared_ptr: он поддерживает std::unique_ptr, т. е. конструктор.

boost::shared_ptr нет.

помимо постоянства, boost::shared_ptr в настоящее время сохраняет по крайней мере два преимущества ниши над std::shared_ptr:

  • в наличии boost::make_shared_noinit. Это особенно полезно в сочетании с массивами, избегая как затрат на нулевую инициализацию, так и накладных расходов на отдельное распределение. (FWIW, это также предлагаемое дополнение стандартные.)
  • импульс.Питон делает специальное использование boost::shared_ptr's поддержка типа стирается пользовательские удалители, но еще не делает то же самое для std::shared_ptr.

Я нашел std::shared_ptr, чтобы быть быстрее, чем boost:: shared_ptr. Я сделал тест, вы можете просмотреть код и увидеть результаты круговой диаграммы, сравнивая общие указатели boost, Qt и std.

enter image description here

https://www.osletek.com...