我应该从使用boost :: shared_ptr切换到std :: shared_ptr?
我想用-std=c++0x
在GCC中启用对C ++ 0x的支持。 我并不一定需要GCC 4.5(和4.6版本)中目前支持的C ++ 11特性 ,但我想开始习惯它们。 例如,在我使用迭代器的一些地方, auto
types会很有用。
但是,我不需要任何当前支持的function。 这里的目标是鼓励我将新标准的特征融入到我的编程“词汇”中。
从你所了解的C ++ 11的支持中,在GCC中启用它是一个好主意,然后通过例如从使用boost::shared_ptr
到std::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
还没有这样做 。
- boost :: function和boost :: bind是如何工作的
- 更多精神疯狂 – parsing器types(规则vs int_parser <>)和元编程技术
- 如何初始化一个属于类成员的shared_ptr?
- CMake:unit testing的项目结构
- `const shared_ptr <T>`和`shared_ptr <const T>`之间的区别?
- boost.org的Spirit parser-generator框架的缺点是什么?
- 为什么std :: function不平等?
- Boost.Process在哪里?
- 致命错误LNK1104:无法打开文件'libboost_system-vc110-mt-gd-1_51.lib'