我们应该选择Boost还是标准库?

Should we prefer Boost or standard lib?

本文关键字:标准 Boost 选择 我们      更新时间:2023-10-16

我正在阅读Boost数组文档,我看到这一行:

如果你正在使用c++ 11,你应该考虑使用std::array而不是boost::array

在我的印象中,Boost的主要库总是优于标准库,因为:

  • boost的性能永远不会比标准lib
  • 差。
  • boost可以提供更多的功能
  • boost最终与标准库具有相同的质量(编写c++标准的人是活跃的boost开发人员/管理人员)
  • 主要的boost特性将在几年后在标准库中结束

所以我更喜欢boost而不是stdlib吗?

如果不是/更复杂,我的哪些假设是要纠正的?

我认为您应该在可用时使用标准库,因为…它是标准的,是编译器自带的。此外,如果你使用boost,你需要一个烦人的外部依赖项。

所以,我的建议是:尽可能使用std。如果您正在编写可移植代码,并且必须使用旧编译器进行编译,则可以考虑使用自己的名称空间(例如:cxx0x),该名称空间根据您正在使用的编译器嵌入std或boost名称空间(这称为名称空间别名):

#ifdef COMPILER_HAS_CXX0X
    #include <memory>
    namespace cxx0x = std;
#else
    #include <boost/shared_ptr.hpp>
    namespace cxx0x = boost;
#endif
...
cxx0x::shared_ptr<MyClass> = ...

来自Boost人自己:

为什么组织应该使用Boost?

总之,生产力。使用像Boost这样的高质量库加速初始开发,结果更少的bug,减少重新发明轮子和削减长期维护成本。由于Boost库往往会变得过时事实上或法律上的标准,很多程序员已经很熟悉了他们。

10个Boost库是包含在c++标准库的TR1等都预定以后满标准化。更多Boost库TR2正在筹备中。使用Boost库提供了一个组织在采用新事物方面领先一步技术。

许多组织已经在使用程序使用Boost实现,比如Adobeacrobatreader7.0 .

根据我自己的经验,我现在更喜欢使用boost。也许这是历史原因,但我发现VC2008附带的TR1中的STD尝试有太多错误,尽管PJ Plauger尽了最大努力,但他无法重现经过同行评审和检查的boost代码的质量,这些代码已经经历了相当长的历史。

除非他们真的可以把boost代码用在STD中,他们为什么要更好地复制它呢?当然,有时他们可能会,他们真的应该共同努力,而不是相互对抗。

我现在做的一件事是声明一个别名命名空间,通常称为spns,因此:

namespace spns = boost;

之后,我可以在我的代码中使用spns::shared_ptr (spns代表"共享指针名称空间"),如果我们稍后更改为std,那么很容易找到一个地方并编辑那一行和include。

当涉及到c++ 11时,标准和boost的代码有重大变化是c++ 03。因此,现在图书馆的某些部分可能会发生变化。我估计boost的一些优秀库将在c++ 11中变得几乎过时,例如,没有人会再使用boost::lambda了,他们只会使用lambda的新语言语法。

所以,是的,当您迁移到c++ 11时,可能是时候放弃部分boost库并使用新版本了。

我在针对c++ 11开发的开源软件中看到的趋势是将api兼容(子集)功能从STD转移到boost——因为boost可用于非c++ 11兼容的编译器,而STD功能(显然)不兼容。

一个很好的例子是mosh。

对于api兼容的特性,只需切换名称空间即可。事实上,如果可以的话,没有理由不把它作为一个配置选项。

边栏:如果您链接到最新版本的非头文件boost库,请预先警告某些特性不再可用,除非boost是用-std=c++11编译的。我最近在boost::filesystem API中的某些函数中遇到了这个问题。

如果可以成为标准,就让它成为标准。如果不能,则尽可能使用更标准的解决方案(BOOST就是为此而设计的)

许多标准库特性来自boost,这些特性继续存在以支持部署的应用程序,而这些特性尚未标准化。

对标准化特性使用boost实际上是"向后看"。有时是必要的(可能是标准库特定的实现不包括所有需要的东西……在windows上看到boost::thread而不是std::thread是很典型的,因为std实现还没有被一些编译器移植),但我不会让它成为一个规则。