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

| 我想用
-std=c++0x
在GCC中启用对C ++ 0x的支持。在GCC 4.5(以及不久的4.6)中,我并不一定需要任何当前受支持的C ++ 11功能,但是我想开始习惯它们。例如,在一些使用迭代器的地方,使用
auto
类型会很有用。 但是,我不需要任何当前支持的功能。这里的目的是鼓励我将新标准的功能纳入我的编程“词汇表”中。 从对C ++ 11支持的了解来看,在GCC中启用它,然后例如通过将使用
boost::shared_ptr
切换为
std::shared_ptr
作为两者不混合的方式来拥抱它是一个好主意吗? PS:我知道这个很好的问题,可以比较flavor4 good的不同风味,但我想在标准最终确定之前就该使用哪个更高层次的建议。换句话说,当像GCC这样的编译器说它支持“实验功能”时,是否表示我很可能在编译期间遇到奇怪的错误,而这将是主要的时间消耗,并且是StackOverflow上的一些神秘问题的来源? 编辑:我决定从ѭ3切换回去,因为我只是不信任它在GCC 4.5中的支持,如本问题中的示例所示。     
已邀请:
        切换到ѭ3的原因有两个: 您删除对Boost的依赖。 调试器。根据您的编译器和调试器的不同,调试器可能是“聪明的”(大约3分),并直接显示指向对象的对象,而在这种情况下,boost的实现就不会这样。至少在Visual Studio中,“ 3”看起来像调试器中的普通指针,而“ 2”则暴露了一堆boost's内部。 您的链接问题中定义的其他新功能。 您将获得几乎可以保证启用了移动语义的实现,这样可以节省一些引用计数修改。 (从理论上讲-我自己还没有测试过)至少从2014年7月22日开始,ѭ2理解移动语义。
std::shared_ptr
在数组类型上正确使用
delete []
,而
boost::shared_ptr
在这种情况下会导致未定义的行为(必须使用
shared_array
或自定义删除器)(实际上,我已经纠正了。请参见-对此的专门化仅针对
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的程度。我个人仅非常少地使用它(实际上是单个项目中的随机数库)。我最近开始在其他项目中使用ѭ0,并且在其中使用了诸如shared_ptr之类的新std ::库功能。我希望我的项目具有最小的依赖关系,所以我宁愿依赖编译器的标准库实现,也不依赖boost。 但是我不认为这个问题有一个千篇一律的答案。     
        如果可用,应始终尽可能使用
std::shared_ptr
,而不要使用boost。这基本上是因为所有使用
shared_ptr
的新接口都将使用标准共享ptr。     
        在编译器允许的情况下,开始养成使用std :: shared_ptr的习惯可能不是一个坏主意。由于界面与boost \的shared_ptr相同,因此您随时可以根据需要切换回去。     
        如果您只是在一个很好的平台上构建(请进行切换) (注意:您确实有用于验证向后兼容性的单元测试,不是吗?) 如果您在多个平台上进行编译会变得有些尴尬,因为您需要验证g ++ 4.5的功能在您使用的所有平台上均可用(即,针对MAC / Linux进行构建,默认的Mac g ++编译器仍然是其中的几个)。版本位于Linux上默认编译器的后面)。     
        切换到
std::shared_ptr
的另一个原因: 它支持
std::unique_ptr
,即具有构造函数。
boost::shared_ptr
没有。     
除了实现一致性之外,“ 2”目前比“ 3”还保留至少两个利基优势:
boost::make_shared_noinit
。与数组结合使用时特别有用,可以避免零初始化的成本和单独分配的开销。 (FWIW,它也是对该标准的拟议补充。) Boost.Python特别利用了ѭ2对类型擦除的自定义删除器的支持,但对ѭ3却没有做同样的事情。     
        我发现std :: shared_ptr比boost :: shared_ptr更快。我做了一个测试,您可以查看代码并比较boost,Qt和std共享指针的饼图结果。 https://www.osletek.com ...     

要回复问题请先登录注册