Boost 和 STL 相比有哪些优点和劣势?

1. 在设计原则上,STL和Boost大致统一
由于STL和Boost基本上都是标准委员会那批人在策划、审核和维护,因此口味上是相对接近的。
可是由于Boost并不在标准中,或者说是下一代标准的试验场,因此库的种类要更多一些,手法也更加丰富一些。

2. STL/Boost 针对 Developer 和 User 的要求不一样
对于Boost开发者而言,强调的是代码可读、高效、强调元编程和编程技巧。程序员

补注:评论里面果真有人提到说可读性和元编程有矛盾。这种说法大概相似于“这段代码可读性差是由于业务太复杂”。这是不对的。可读性是要创建在正确的知足功能和性能的基础上的。这也是为何我要特别为后两点解(Jiao)释(Bian)一下。


这里要解释一下后两点:编程

  • 编程技巧主要是为了实现一些看起来有点像天方夜谭的功能,例如C++11以前的Boost.Auto(利用了编译器的Bug或者特性);以及1.56才加入的TypeIndex,该宏利用了编译器能产生Mangled/Demangled函数签名的能力。
  • 元编程主要是为了解决三个问题:
    • 增长宏/模板演算的能力,为图灵完备的模板编程提供类型/常量运算的库,方便开发者。例如Boost.MPL和Boost.PP;
    • 增长C++的语言内描述能力,也就是Embedded DSL。例如Spirit和Proto,都是很好的例子;
    • 作尽量多的静态检查。好比Boost.Chrono将单位绑定到类型中,解决了单位转换容易出错的问题。

而STL由于处于标准中,因此会对不一样平台的编译器都作出了统一要求,须要编译器配合的地方,也不会用语言机制或者奇技淫巧来迁就,例如Static Assertion、Auto、decltype,在Boost当中是以必定的技巧实现的(由于编译器不能直接支持),而在C++11种就变成了一个内置的语言特性。与此相似的还有不少的Type Traits。

对于User而言,Boost/STL的库能够分为四种风格。网络

  • 第一种风格为Lib风格,以提供功能为主,使用方法通常也就是as-is。例如Pool,Graph,Interval,Chrono,ASIO等。它们的接口使用也能够分为两个部分,第一阶段是型别特化,第二阶段是基于运行时接口。STL和Boost里,大部分库都是这样的风格。这也是最容易使用和使用频率最高的风格。
  • 第二种风格是语法糖类。Boost.Foreach等都属于这一类。可是在STL中就很是罕见,由于语言已经获得了充分升级。
  • 第三种风格是范式和方法论的拓展,即在C++中模拟其余编程范式和方法论。例如spirit,lambda,proto。严格的说,boost.mpl也能够归属此类。这一类库的使用方式分为两步,第一步是定制方言,第二步是使用方言。这类应用由于面向库的开发者,因此STL中很难见。
  • 第四类风格,是元编程。利用模板和宏进行编译器推导,以实现代码展开、选择编译等工做。典型的例子有Boost.PP,STL/Boost.TypeTraits,enable_if等,这一部分对于通常用户是能够不用的。STL中有部分基础的元编程支持(例如Traits)。

由于STL多数是面向通常程序员,因此以第一种库居多,而Boost包含了所有四类的库的风格。

3. 文档
Boost的文档基本上是tutorial风格的,Reference作的并很差。而被标准化的STL一般会有更加清晰易读的Reference。

4. 平台特定性
Boost有不少支持不一样平台、或者IO相关的玩意儿,好比Boost.Process,GIL,ASIO,Context,哪一个都不是平台无关的省油灯。反观STL对这方面一直都很保守,以前一直就只有容器这类东西,C++11以后才把Thread、File System这种和平台有些关系的内容陆续给弄进来,IO和网络到如今都是一块爱财如命的荒地。

5. 问题
Boost和STL的问题几乎是相通的,就是由于模板使用多,编译时间较长,二进制也相对较大。编译错误也不是很是明确。Boost中一些元编程份量更多的库,例如MSM和Spirit的问题要更加严重。
此外,由于Boost是试验性质的库,因此接口可能不是很是稳定。而一旦库进入STL以后,就几乎不可能有变化了。好比Boost.Filesystem在进入TR2以前,前后有三个比较大版本的API变更;Spirit也作出了一次比较大的调整。
还有就是,Boost的库和其它语言的标准库相比,零散杂乱,我常常也忘记Boost/STL中的某些库,本身去发明了一个一点都很差用的轮子。

6. 干儿子
最后就是,虽然Boost是标准委员会的干儿子,可是也不保证它的实现就必定是进入STL。好比网络库,最后进标准的,应该是CppNetlib,而不是ASIO。函数

 

 

references:性能

http://www.zhihu.com/question/27558334设计

相关文章
相关标签/搜索