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
Boost 和 STL 相比有哪些优势和劣势?的更多相关文章
- CDN和双线机房相比有何优势
1.什么类型的网站最需要CDN? 适合目标客户覆盖全国范围的网站,不论是南方电信.还是北方网通用户.铁通用户,均要求能快速访问到客户网站,彻底解决电信.网通之间的互访瓶颈. 另外国外的网站,如果需要提 ...
- vue.js与react.js相比较的优势
vue.js的简介 vue.js是一个javascript mvvm库,它是以数据驱动和组件化的思想构建的.我们平时多用js去操作dom,vue.js则是使用了数据绑定驱动来操作dom的,也就是说创建 ...
- 为什么Netty这么火?与Mina相比有什么优势?
Netty是什么?为什么这么火? Netty是目前最流行的由JBOSS提供的一个Java开源框架NIO框架,Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服 ...
- Array的简单使用(Boost和STL通用)
目录 目录 介绍 使用 Boost和STL的区别 介绍 本来这一次是想简单介绍一下Boost里面的协程库的使用的,但是Boost.Coroutine已经被废弃了,而Boost.Coroutine2目前 ...
- 17.1.2.1 Advantages and Disadvantages of Statement-Based and Row-Based Replication 基于语句和行的复制的优势和劣势
17.1.2.1 Advantages and Disadvantages of Statement-Based and Row-Based Replication 基于语句和行的复制的优势和劣势 每 ...
- JSP的优势与劣势浅析
本文简单介绍了JSP技术,并对JSP的优势与劣势进行了简单的分析.JSP页面由HTML代码和嵌入其中的Java代码所组成. JSP(JavaServer Pages)是由Sun Microsystem ...
- Mono for Android 优势与劣势
原文:Mono for Android 优势与劣势 最近有兴趣了解一下Mono for Andriod,也就是使用.NET平台来开发Andriod程序.Mono for Android API 几乎映 ...
- (转)Mono for Android 优势与劣势
最近有兴趣了解一下Mono for Andriod,也就是使用.NET平台来开发Andriod程序.Mono for Android API 几乎映射标准的Andriod API.例如,两边API几乎 ...
- Oracle RAC的五大优势及其劣势
Oracle RAC的五大优势及其劣势 不同的集群产品都有自己的特点,RAC的特点包括如下几点: 双机并行.RAC是一种并行模式,并不是传统的主备模式.也就是说,RAC集群的所有成员都可以同时接收客户 ...
随机推荐
- 标准简单SP模板(oracle)
/* -- @author: Lijy -- @function: 员工入职的信息检查程序 -- @parr: P_URID 为workshop操作账号的ID,前台通过 {U_URID} 全局参数获取 ...
- fsck 修复ext3文件系统(用于linux系统时间不对,文件系统信息有错引起的die with exit status等的一些问题)
有时候我们用虚拟机装了linux,可是我们做开发的人员,系统时间可能出于一些特殊要求调整过(例如保持一些特殊软件不过期,需要锁定时间等等),这样linux的系统时间久不准了,如果时间不准,会造成ext ...
- Android Studio中解决Gradle DSL method not found: 'android()'
近期导入as的项目出了这种问题 这个问题困扰了我非常长时间,好吧,搜了半天全都是runProguard的.最后在stackoverflow上搜到解决的方法了: http://stackoverflow ...
- Linux应用程序打包
原文地址:http://blog.solrex.cn/articles/packaging-1-src.html1. 应用程序打包技术之一(源代码篇) 相信很多朋友都曾经为方便做某件事写过自己的小 ...
- table标签
table标签使我们最常用的的标签,在使用table标签时我们要注意一些其属性,早期我们经常使用table标签对其进行页面布局但是现在我们基本不再使用,由此可见table标签也是非常强大的一个工具. ...
- 触摸事件 Touch MotionEvent ACTION
MotionEvent简介 当用户触摸屏幕时,将创建一个MontionEvent对象,MotionEvent包含了关于发生触摸的位置.时间信息,以及触摸事件的其他细节. 获取MontionEvent对 ...
- Myeclipse+Tomcat安装与配置
一: Myeclipse安装很简单,没什么可说的,下面说一下怎么把英文版的Myeclipse汉化的问题 1.把汉化包解压,将解压后的“language”文件夹,放入Myeclipse\common文件 ...
- 【转】Android开源项目 分类 便于查看
之前转载了一个开源项目的文章,发现那些都是没有系统的总结,这里又转载一篇有系统总结的文章. Android开源项目系列汇总已完成,包括: Android开源项目第一篇——个性化控件(View)篇 An ...
- TODO、FIXME和XXX转载
代码中特殊的注释技术——TODO.FIXME和XXX的用处 // TODO Auto-generated method stub
- DIV布局之道二:DIV块的嵌套,DIV盒子模型
本文讲解DIV块布局的第二种使用方式:嵌套.“DIV嵌套”在有些文献中也被称为“盒子模型”,说的通俗一点就是嵌套(一个大的DIV块内部又包含一个或多个DIV块). 请看如下代码: CSS部分: CSS ...