我们应该选择Boost还是标准库?
Should we prefer Boost or standard lib?
我正在阅读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实现还没有被一些编译器移植),但我不会让它成为一个规则。
- 任何用于 boost::p roperty 树的标准库实现
- 如何将来自 Boost.Python 的map_indexing_suite与自定义而不是标准对象一起使用?
- 非推导上下文,如标准库中的"boost::mpl::identity:<T>:type"?
- 将 boost:::chrono::steady_clock::time_point 转换为标准::时间::steady
- Boost::算法是否被纳入标准库?
- 用STD = C 11或其他标准编译Boost,例如Ash C 14
- 标准::键映射和/或 boost::any 类型的值的类型检查
- 使用标准库或Boost库从一组数据中计算直方图
- Boost 能做什么现代C++的标准库做不到的?在程序中将 boost 作为依赖项包含有什么需要?
- 如何将 boost::string_view 转换为标准::string_view
- 如何将 Boost 库与 CMake 链接(如果 boost 位于非标准位置,则在集群上)?
- 如何使用标准迭代器使用`boost :: range`迭代器
- Boost或标准库是否提供了一种检查演员阵容是否无损的方法
- 将 boost::scoped_ptr 更改为标准::unique_ptr
- 将Boost库包含到标准MinGW路径中
- 如何将标准::字符串格式的 JSON 解码为 Boost 属性树
- TimerCallback函数基于没有Boost的标准模板库
- 如何将 boost::gregorian::greg_year 转换为标准::字符串
- boost::精神与非标准(非字符串)输入流
- 标准/ Boost工具,用于推进迭代器,直到命中结束符或分隔符