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


69

我想在中启用GCC中对C ++ 0x的支持-std=c++0x。在GCC 4.5(以及不久的4.6)中,我并不一定需要任何当前受支持的C ++ 11功能,但是我想开始习惯它们。例如,在一些我使用迭代器的地方,一种auto类型会很有用。

但是同样,我不需要任何当前支持的功能。目的是鼓励我将新标准的功能纳入我的编程“词汇表”中。

从对C ++ 11支持的了解来看,在GCC中启用它,然后例如通过boost::shared_ptr将使用从切换为std::shared_ptr单独使用,而不是两者混合使用,将其包含进来,是一个好主意吗?

PS:我知道这个比较不同口味的好问题shared_ptr但我想在标准定稿之前就使用哪种更高层次的建议提出建议。换句话说,当像GCC这样的编译器说它支持“实验功能”时,是否意味着我很可能在编译期间遇到奇怪的错误,而这将是主要的时间消耗,并且是StackOverflow上的一些神秘问题的来源?

编辑:我std::shared_ptr之所以决定从此退回,因为我不信任它在GCC 4.5中的支持,如本问题中的例子所示


7
我想知道boost在使用支持它的编译器时是否可以仅将typedef用作std :: shared_ptr?
Mark Ransom

在这里找不到具体的问题吗?投票关闭。
user7116 2011年

4
我认为问题很明显,只是答案不是简单的是或否。答案需要一个赞成/反对名单,就像我标记为答案的名单一样。问题本质上是:您是否建议在标准最终确定之前使用std :: shared_ptr?为什么或者为什么不?
艾伦·图灵

Answers:


60

切换到std::shared_ptr以下几种原因:

  • 您删除对Boost的依赖。
  • 调试器。根据您的编译器和调试器的不同,调试器可能是“聪明的”,std::shared_ptr并直接显示指向对象的对象,而在这种情况下,boost的实现就不会。至少在Visual Studio中,它std::shared_ptr看起来像调试器中的普通指针,同时boost::shared_ptr暴露了一堆boost的内脏。
  • 您的链接问题中定义的其他新功能。
  • 您将获得几乎可以保证启用了移动语义的实现,这样可以节省一些引用计数修改。(从理论上讲-我自己还没有测试过)至少从2014年7月22日开始,您boost::shared_ptr了解移动语义。
  • 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

5
typedef shared_ptr std::shared_ptr
GManNickG

1
@GManNickG:大声笑。接得好。该死的typedef向后工作!(感觉就像是对我的任务)
Billy ONeal

@GManNickG:嗯...回头看一下,也许使用using语句会更好。你怎么看?
Billy ONeal 2013年

是的,模板using是正确的:template <typename T> using shared_ptr = std::shared_ptr<T>;。问题在于这是C ++ 11功能,因此在这种boost::shared_ptr情况下不能使用它。:) C ++ 03方法是另一种具有内部typedef的类型
GManNickG

@GMan:您不能只是“使用std :: shared_ptr;”并将该名称带入该命名空间中?
比利·奥尼尔

13

我想这取决于您使用Boost的程度。我个人只是非常谨慎地使用它(实际上是在单个项目中使用随机数库)。我最近开始将其-std=c++0x用于其他项目,并且在其中使用了诸如shared_ptr之类的新std ::库功能。我希望我的项目具有最少的依赖关系,所以我宁愿依赖编译器的标准库实现,也不愿依赖boost。

但是我认为这个问题没有一个万能的答案。


12

如果std::shared_ptr可能的话,应该始终使用它,而不要使用boost。这基本上是因为所有使用的新接口都shared_ptr将使用Standard共享ptr。


7

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


4

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

如果您在多个平台上进行编译会变得有些尴尬,因为您需要验证g ++ 4.5的功能在您使用的所有平台上均可用(即,针对MAC / Linux进行构建,默认的Mac g ++编译器仍然是其中的几个)。版本位于Linux上默认编译器的后面)。


4

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

boost::shared_ptr 没有。



1

我发现std :: shared_ptr比boost :: shared_ptr更快。我进行了测试,您可以查看代码并比较boost,Qt和std共享指针的饼图结果。

在此处输入图片说明

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


令我惊讶的是,使用malloc和new的情况是如此之快。我认为,如果性能下降比调用慢10倍,那么谁也不想使用智能指针。您的测试用例不具有可比性:1.仅对malloc和new调用一次,分配一个长度为LENGTH的数组,而在所有其他情况下,分配均进行LENGTH次; 2.对于malloc和new,您将rand的结果分配给已分配的数组,而在所有其他情况下,分配的结果都被推回向量中,从而导致进一步的内存分配/重新分配。
andreas buykx

1
附带说明:饼形图并不是显示此类数据的非常有用的方法。本文将告诉您为什么... perceptualedge.com/articles/visual_business_intelligence/...
安德烈亚斯buykx
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.