我应该从使用boost :: shared_ptr切换到std :: shared_ptr?

我想用-std=c++0x在GCC中启用对C ++ 0x的支持。 我并不一定需要GCC 4.5(和4.6版本)中目前支持的C ++ 11特性 ,但我想开始习惯它们。 例如,在我使用迭代器的一些地方, autotypes会很有用。

但是,我不需要任何当前支持的function。 这里的目标是鼓励我将新标准的特征融入到我的编程“词汇”中。

从你所了解的C ++ 11的支持中,在GCC中启用它是一个好主意,然后通过例如从使用boost::shared_ptrstd::shared_ptr ,混合?

PS:我知道这个比较不同风格的shared_ptr 好问题 ,但是我要求在标准最终确定之前就要使用哪个更高层次的build议。 另外一种方法是,像GCC这样的编译器说它支持“实验性function”,这是否意味着在编译期间我可能会遇到奇怪的错误,这将是主要的时间和StackOverflow的隐藏问题的来源?

编辑 :我决定从std::shared_ptr切换回来,因为我不相信它在GCC 4.5中的支持, 如在这个问题中的示例所示 。

有几个原因切换到std::shared_ptr

  • 你删除了对Boost的依赖。
  • debugging器。 根据你的编译器和debugging器的不同,debugging器可能对std::shared_ptr是“聪明的”,并直接显示指向的对象,在那里不会说boost的实现。 至less在Visual Studio中, std::shared_ptr在debugging器中看起来像一个普通的指针,而boost::shared_ptr公开了一堆boost的内部。
  • 链接问题中定义的其他新function。
  • 你得到一个几乎保证移动语义启用的实现,这可能会节省一些refcount修改。 (理论上 – 我自己没有testing过)至less在2014-07-22, boost::shared_ptr理解移动语义。
  • std::shared_ptr在数组types上正确使用delete [] ,而boost::shared_ptr在这种情况下会导致未定义的行为(您必须使用shared_array或自定义的deleter) (实际上我正确的修正了这个问题。仅unique_ptr ,而不是shared_ptr 。)

一个主要的明显原因不是:

  • 你会限制自己的C ++ 11编译器和标准库的实现。

最后,你并不需要select。 (如果你的目标是一个特定的编译器系列(例如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 

我想这取决于你使用提升多less。 我个人只是非常谨慎地使用它(实际上是一个项目中的随机数字库)。 我最近开始对我的其他项目使用-std=c++0x ,并且在它们中使用了像shared_ptr这样的新的std :: libraryfunction。 我喜欢我的项目有最小的依赖关系,所以我宁愿依赖于编译器的标准库实现比boost。

但我不认为这个问题有一个通用的答案。

如果可用的话,你应该总是使用std::shared_ptr ,而不是boost。 这基本上是因为所有使用shared_ptr新接口都将使用标准共享ptr。

在编译器允许的情况下开始养成使用std :: shared_ptr的习惯可能不是一个坏主意。 由于该接口与boost的shared_ptr相同,因此您可以随时切换回来。

如果你只是build立在一个很好的平台上(开关)
(注意:您确实有unit testing来validation向后兼容性吗?)

如果你在多个平台上进行编译,那么你需要validationg ++ 4.5上的特性在你使用的所有平台上都是可用的(比如为MAC / Linux构build,默认的Mac g ++编译器仍然是一些版本在Linux上的默认编译器后面)。

切换到std::shared_ptr另一个原因:它支持std::unique_ptr ,即有构造函数。

boost::shared_ptr不。

除了实现一致性, boost::shared_ptr目前至less比std::shared_ptr至less保留两个利基优势:

  • boost::make_shared_noinit的可用性。 与数组结合使用特别有用,避免了零初始化的成本和单独分配的开销。 (FWIW,这也是对标准的补充 。)
  • Boost.Python特别使用了boost::shared_ptr对types清除的自定义删除器的支持,但是对于std::shared_ptr还没有这样做 。