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

标签 c++ boost stl c++11 shared-ptr

我想通过 -std=c++0x 在 GCC 中启用对 C++0x 的支持。我不一定需要任何 currently supported C++11 features在 GCC 4.5(很快 4.6)中,但我想开始习惯它们。例如,在我使用迭代器的一些地方,auto 类型会很有用。

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

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

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

编辑:我决定从 std::shared_ptr 切换回来,因为我只是不相信它在 GCC 4.5 中的支持为 shown by example in this question .

最佳答案

切换到 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 或自定义删除器) (实际上我是正确的。参见 this -- 专门针对 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

关于c++ - 我应该从使用 boost::shared_ptr 切换到 std::shared_ptr 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6322245/

相关文章:

c++ - 当(执行时间)>>>(编译时间)时,多个编译单元是否仍然值得?

c++ - boost 两个线程

c++ - 何时使用 std::unordered_set 而不是 std::set?

c++ - 线程本身终止时如何删除boost线程对象?

boost - 路径简化/减少

c++ - 使用具有可定义状态的仿函数作为 unordered_set 哈希函数

c++ - STL 映射 C++ 中的最高值?

c++ - 在 makefile 中,如何对变量中的每个文件名执行命令?

C++:在类中使用带有静态变量的 map 时遇到问题,我得到 undefined symbol

C++ 弹道