C++ 我应该从使用boost::shared\u ptr切换到std::shared\u ptr吗?

C++ 我应该从使用boost::shared\u ptr切换到std::shared\u ptr吗?,c++,boost,stl,c++11,shared-ptr,C++,Boost,Stl,C++11,Shared Ptr,我想使用-std=C++0x在GCC中启用对C++0x的支持。我不一定需要GCC4.5(很快将是4.6)中的任何一个,但我想开始习惯它们。例如,在我使用迭代器的一些地方,auto类型会很有用 但是,我不需要当前支持的任何功能。这里的目标是鼓励我将新标准的特性融入到我的编程“词汇表”中 从您对C++11支持的了解来看,在GCC中启用它是一个好主意,然后通过(例如)从使用boost::shared_ptr切换到std::shared_ptr来接受它,因为两者不会混合使用 PS:我知道哪些比较了共享的

我想使用
-std=C++0x
在GCC中启用对C++0x的支持。我不一定需要GCC4.5(很快将是4.6)中的任何一个,但我想开始习惯它们。例如,在我使用迭代器的一些地方,
auto
类型会很有用

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

从您对C++11支持的了解来看,在GCC中启用它是一个好主意,然后通过(例如)从使用
boost::shared_ptr
切换到
std::shared_ptr
来接受它,因为两者不会混合使用

PS:我知道哪些比较了共享的不同口味,但我要求在标准最终确定之前提供更高级别的建议。另一种说法是,当像GCC这样的编译器说它支持“实验性功能”时,这是否意味着我在编译过程中可能会遇到一些奇怪的错误,这些错误将是主要的时间消耗,并且是StackOverflow上神秘问题的来源


Edit:我决定从
std::shared\u ptr
切换回来,因为我不相信它在GCC4.5 as中的支持。

我想这取决于您使用boost的程度。我个人只是非常谨慎地使用它(事实上,在单个项目中使用随机数库)。我最近开始在我的其他项目中使用
-std=c++0x
,并在其中使用了新的std::library功能,如shared_ptr。我希望我的项目具有最小的依赖性,因此我宁愿依赖于编译器的标准库实现,而不是boost


但是我不认为这个问题有一个一刀切的答案。

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

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

如果您只是在一个很好的平台上构建(进行切换)
(注意:您确实有单元测试来验证向后兼容性,不是吗?)


如果您在多个平台上编译,则会变得有点尴尬,因为您需要验证g++4.5上的功能是否在您使用的所有平台上都可用(即为MAC/Linux构建默认的MAC g++编译器仍然比Linux上的默认编译器落后两个版本).

切换到以下位置有几个原因:

  • 您消除了对Boost的依赖
  • 调试器。根据编译器和调试器的不同,调试器可能在
    std::shared_ptr
    方面“智能”,并直接显示指向的对象,而不是boost的实现。至少在VisualStudio中,
    std::shared_ptr
    看起来像调试器中的一个普通指针,而
    boost::shared_ptr
    则公开了一堆boost的内部
  • 链接问题中定义的其他新功能
  • 您得到的实现几乎可以保证启用了移动语义,这可能会节省一些refcount修改。(理论上——我自己没有测试过)至少从2014年7月22日起,
    boost::shared_ptr
    理解移动语义
  • std::shared_ptr
    在数组类型上正确使用
    delete[]
    ,而
    boost::shared_ptr
    在这种情况下会导致未定义的行为(您必须使用
    shared_数组
    或自定义删除器)(事实上,我的观点是正确的。请看——这方面的专门化只针对
    unique\u ptr
    ,而不是
    shared\u ptr
还有一个明显的理由是:

  • 您将仅限于C++11编译器和标准库实现
最后,您真的不必选择。(如果您的目标是特定的编译器系列(例如MSVC和GCC),您可以轻松地将其扩展为使用
std::tr1::shared_ptr
。不幸的是,似乎没有检测tr1支持的标准方法)

#if u cplusplus>199711L
#包括
名称空间MyProject
{
使用std::shared_ptr;
}
#否则
#包括
名称空间MyProject
{
使用boost::shared\u ptr;
}
#恩迪夫

切换到
std::shared\u ptr
的另一个原因: 它支持
std::unique\u ptr
,即具有构造函数


boost::shared_ptr
没有。除了实现一致性之外,
boost::shared_ptr
目前比
std::shared_ptr
至少保留了两个利基优势:

  • 的可用性。它在与阵列结合使用时特别有用,避免了零初始化的成本和单独分配的开销。(FWIW,这也是标准的一个优点。)
  • Python特别利用了
    Boost::shared_ptr
    对类型擦除的自定义删除程序的支持,但是

我发现std::shared\u ptr比boost::shared\u ptr快。我做了一个测试,您可以查看代码并查看比较boost、Qt和std共享指针的饼图结果


我想知道boost在使用支持它的编译器时是否可以使用typedef to std::shared\u ptr?在这里找不到具体问题?投票结束。我认为问题很清楚,只是答案不是简单的是或否。答案需要一个赞成/反对列表,就像我标记为答案的列表一样。问题本质上是:您是否建议在标准最终确定之前使用std::shared_ptr?为什么?为什么
#if __cplusplus > 199711L
#include <memory>
namespace MyProject
{
    using std::shared_ptr;
}
#else
#include <boost/shared_ptr.hpp>
namespace MyProject
{
    using boost::shared_ptr;
}
#endif