在设计原则上,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。

STL库和Boost库相关推荐

  1. 使用logcxx库和boost库构建系统日志的格式化输出

    作者:朱金灿 来源:http://blog.csdn.net/clever101/ logcxx库作为一个强大的C++日志系统,在业内得到越来越多的应用.但是logcxx库欠缺一个格式化日志输出的能力 ...

  2. boost库在visual studio、DevC++和vscode上的环境配置

    目录标题 @[TOC](目录标题) 1.boost库简介 1. 获取 Boost 2. Boost 的目录结构 3. Boost 使用方式 2.在DEVC++中配置使用boost库的环境 3.在vis ...

  3. Linux下安装和使用boost库

    Linux下安装和使用boost库 2016-08-26 20:29:06 zhaomax 阅读数 349更多 分类专栏: C++ 用boost库中的serialization库.Boost库分为两个 ...

  4. Boost库编译安装

    一.Boost库介绍 Boost库是一个经过千锤百炼.可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一.Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成 ...

  5. C++ Boost库:简介和第一个示例程序

    文章目录 1. 简介 2. Boost库开发环境搭建 3. 一个简单的示例程序 4. hpp文件简介 C++ Boost库:简介和第一个示例程序 C++ Boost库:数值转换 lexical_cas ...

  6. 【C++】Boost库简介

    参考: https://blog.csdn.net/f110300641/article/details/81865545 https://www.boost.org/doc/libs/1_80_0/ ...

  7. Boost库安装与使用

    简介 Boost库是一个可移植.提供源码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一.Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容.在C ...

  8. Restful 学习笔记1(包含centos boost库安装)

    一.基础知识 1.1 restful REST(Representational State Transfer)表象化状态转变(表述性状态转变),在2000年被提出,基于HTTP.URI.XML.JS ...

  9. C++ Boost库:数值转换 lexical_cast

    文章目录 1. C/C++数值转换函数 2. boost数值转换lexical_cast C++ Boost库:简介和第一个示例程序 C++ Boost库:数值转换 lexical_cast C++ ...

  10. C++ Boost库:日期时间库 date_time

    文章目录 1. 简介 2. 基本使用 3. date_period类 4. ptime类 5. time_period类 C++ Boost库:简介和第一个示例程序 C++ Boost库:数值转换 l ...

最新文章

  1. C++高精度运算类bign (重载操作符)
  2. 开源一个基于cocos2d-x的游戏--超级六边形(SuperSector)
  3. HIVE中的表以及语法
  4. js和css和img,Node.js压缩web项目中的js,css和图片
  5. 抽象工厂模式:实现ASP.NET访问不同数据库
  6. 2020-11-27(下标寻址和指针寻址)
  7. [css] 如何取消页面中选中的文字?
  8. Docker日志收集最佳实践
  9. UE3 性能调试:动态光照环境
  10. python threading.local
  11. 嵌入式商业智能BI有什么功能
  12. C# 从文本列中检索数据
  13. springboot 导出文件_开发阶段,将SpringBoot应用快速部署到K8S - 程序员欣宸
  14. fc安卓模拟器_跨平台游戏模拟器RetroArch,一个软件畅玩FC 、MD、SFC、GBA游戏
  15. 英语六级翻译整理【未更新完】
  16. @人生随笔:一年一影帝,百年周星驰
  17. python爬虫爬取图片详解_Python使用爬虫爬取静态网页图片的方法详解
  18. 做软文营销发布有哪些常见平台?
  19. web课程设计网页规划与设计:HTML+CSS美妆设计题材——雅诗兰黛(5页)
  20. Mongodb入门(CRUD与安装)

热门文章

  1. python压缩HTML文件,python压缩javascript文件代码
  2. 微信小程序地图与位置相关操作
  3. 适合新手——MySQL中基于SQL语言增删改查等基础的练习大汇总
  4. OpenCV中Rect()函数常用操作和使用详解(含绘图示例)+Rectangle()函数用法
  5. Godot Timer节点
  6. spring 学习书籍
  7. 抽象工厂模式(通俗易懂)
  8. 破解版xmind 8
  9. Windows 10 安装 IIS 管理器
  10. js判断设备是PC端还是移动端