Должен ли я переключиться с использования 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 ответов:
есть несколько причин, чтобы переключиться на
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
.