加载中...
学习C++要学boost库吗?
第1节:代码改善:一个“坑爹”的文字类冒险游戏
第2节:在禁止多重继承的情况下,如何设计“直立智慧猩猩”类?
第3节:C++多线程代码中的“乱序”执行现象
第4节:C++中函数指针有什么作用呢?
第5节:为什么我用c++写的游戏那么简陋?
第6节:多线程读写socket导致的数据混乱的原因是什么?
第7节:WebSocket 是什么原理?为什么可以实现持久连接?
第8节:怎样在c++中实现instanceof?
第9节:一个函数多处 return 是好风格吗?
第10节:C++中虚函数相比非虚函数的优势
第11节:为什么 C::C::C::C::foo() 能编译成功?
第12节:如何静态反射C++枚举的名字
第13节:看C++大叔如何拥 java 妹子入怀……
第14节:坨——理解递归实现“汉诺塔”代码的关键
第15节:C++编译器如何实现 const(常量)?
第16节:C++如何为断言加上消息
第17节:初学C++到什么水平,算是合格的初级开发工程师?
第18节:C++编程要避免使用单例模式吗?
第19节:学习C++要学boost库吗?
第20节:C++的继承就是复制吗?
第21节:C++构造函数失败,如何中止创建对象?
第22节:C++学完多线程后,学什么呢?
第23节:string_view 适合用做函数的返回值类型吗?
第24节:为指针取别名,为何影响const属性?
第25节:std::enable_shared_from_this 的存在意义?
课文封面

先说结论:至少得先去看看 boost 现有的 171 个库,它们都是什么 。合理问题是 :boost 里面的某个库,我要不要用,而不是 boost 我要不要学习。

0. 问题

1.【boost有没有用】在哪些情形下STL不够用,需要用到boost,否则就要自己造轮子?这样的情形多不多?会boost之后和其他不会boost的程序员相比有哪些优势?
2.【boost能不能用】在使用C++开发项目的公司里boost库普及情况如何?公司一般允许不允许使用boost库?开源项目用boost的多不多?
3.【boost好不好用】使用boost库的程序是否易于调试?boost库效率如何?在多线程等环境下使用是否安全?
4.【boost好不好学】boost库学习难度如何?应该先深入学习C++再学boost还是掌握C++基本语法就学boost?应该学习boost的全部还是一些重要的部分?
5. 【boost发展前景如何】?

1. 太长不读,先说结论

先说结论:至少得先去看看 boost 现有的 171 个库,它们都是什么。
因为,合理问题是 :boost 里面的某个库,我要不要用,而不是 boost 我要不要学习。

2. boost.XXX ,XXX都有什么?

是不是应该先注意到一件事: boost 是一个“大杂烩”一样的库。就是说,不存在一个有某特定功能的 boost库,而是存在 171 个库。
这171个库,作者五湖四海,功能五花八门,非要找到171个库全都有的共同点,大概就一个:它们有一个共同的目标:

“兄弟们,C++标准库看起来很弱鸡啊,让我们都来 boost 它吧!说不定哪天就被招安了……”

这和其它我们更常说的某某 C++库,差异是很大的:

  • 比如:Qt ,虽然它也是个大杂库,有线程、有字符串、有时间、有正则,但终归是为构建跨平台的桌面图形用户界面(GUI)。显然,如果你不写桌面应用,就不用去刻意学习Qt。
  • 再如:sogou/workflow,目标与功能都明确而集中:帮你简化并行计算以及为你提供好用的异步网络框架。同样,如果你不需要写网络服务端应用,也不太需要学习它。

除了没有个功能的业务目标之外(“政治”目标有:就是帮C++撑门户),这一大堆库除了来自五湖四海,目标五花八门之外,它们的质量也不一样。

  • 有的是在所要解决的问题的同类库中虽不是首选,但至少是第一梯队的选择,比如 异步库 asio,或者那些本该由标准库提供的,字符串常用的算法,还有那些各种优化的数据结构。
  • 有的呢,也就那样。嗯……纯个人观点吧:比如 boost.Log 似乎不如 spdlog 等没进入boost的日志库;boost.JSON 也不如许多没进入boost的 json库,boost.Format 也不如 没有进入 boost 的 fmt……
  • 有的是废弃与代替关系(Coroutine和Coroutine2)
  • 有的是功能重叠的竞争关系(比如 variant 和 variant2)
  • 有的是林青霞和张柏芝的关系 (比如 lambda 和 lambda2),美人迟暮

再来看这171个库的作用。细说太细了, 从大类上看,至少有:

  1. 数学的
  2. 算法的
  3. 容器/数据结构的
  4. 异步、网络操作的
  5. 并发的
  6. 并行计算的
  7. 操作系统通用功能封装的 (比如 DLL,动态库/共享库,内存、进程、协程 、纤程 )
  8. 配置数据、命令行数据
  9. 语言语法功能模拟与增强的(比如 模拟语言反射,或者没有rang based for 之前的 foreach)
  10. 各种努力以实现函数在C++语言成为“first-class”的……
  11. 还有某种设计模式的实现的……(比如 Flyweight)
  12. 特定数据结果,比如:图 (不是图片,是数据结构中的“图”。比如 Graph 和 GraphParallel),
  13. 帮助C++程序员通过 metaprogramming 实现头秃(从而获得更多尊重)
  14. 真是来帮补 STL的坑的,比如 IOStreams 、Locale 、Nowide
  15. 流行什么我补什么的 比如 JSON
  16. 突然关心起那些因为各原因可能还在用旧版本C++开发人员的,比如:Comapt 、compatibility 、以及 Move ……
  17. 对接其它语言的,不过我只知道有对接 Python的,特别好用
  18. 已经被招安的: thread,filesystem、 时间,随机数、智指、静态断言、unorder、Bind……(还有好多,这些都不要在boost里面学,而是在STL里学)

3. 南老师回答

3.1. boost有没有用

在哪些情形下STL不够用,需要用到boost,否则就要自己造轮子?这样的情形多不多?会boost之后和其他不会boost的程序员相比有哪些优势?

答:这个相当多,至少可分两大类:

  • 一、各种数据结构容器(3)、算法(2)、迭代器。数学库(1)、操作系统功能(7);
  • 二、补STL坑的 (14),特别像 String.Algo ,这哪躲得开。
  • 三、各种偏特定业务的功能的库。比如你要在 C++ 程序里跑 Python(强强联合嘛),就用 boost.Python 以及 Parameter Python Bindings 、或者你要计算CRC、或者你需要做基于动态库的插件系统(那就用上 DLL)、或者需要在在图像数据上做常见处理时(比如要把彩色变成灰度),可以考虑 boost.GIL。
  • 四、并发之类,比如需要用一些 适合无锁并发的数据结构
  • 六、小工具,比如命令行参数、三态bool、Config(配置,哪个实际业务项目不需要配置)
  • 七、写的程序突然特别依赖于多数语言有,但C++没有的功能 ,比如反射、系列化
  • 八、显然没有框架你就干不了的:asio (当然,大框架选择不能太无脑,应和boost之外的库做选型对比)
  • 九、提高编程质量的:异常、错误处理,栈跟踪 Stacktract、单元测试 Test……

3.2 boost能不能用

在使用C++开发项目的公司里boost库普及情况如何?公司一般允许不允许使用boost库?开源项目用boost的多不多?

这有点月经贴了,和更古老的“公司让不让用STL”我认为是一个趋势。一刀切不让用的技术主管应该在急剧消亡,大多数都变得更专业了:只要验证工作和选型工作做得足够,又懂得将特定库以某种形式隔离开来,通常都是可以考虑的。当然,和STL相比,显然,“boost 能不能用”这个问题意义不大,更有意义的是,boost.XXXX 库能不能用。

3.3 boost好不好用

使用boost库的程序是否易于调试?boost库效率如何?在多线程等环境下使用是否安全?

有些 boost 库超好用,有些超难用。中间的要靠认真选型,比如 log 库,json 库这种超具体的。

有些功能,它躲不开的实现方式就决定了它超级难以调试。这和它有没有在 boost 下关系不大。

“多线程等环境下使用是否安全” ?和STL一样,底层库如果实现为多线程安全,其实是一件非常傻的事。

3.4 boost好不好学

boost库学习难度如何?应该先深入学习C++再学boost还是掌握C++基本语法就学boost?应该学习boost的全部还是一些重要的部分?

也是和业务紧密相关的。比如,你想学boost.Process,但你对进程,进程间的通信,这些来自OS 概念都不懂,自然就难学。

再或者,你想学 boost.asio。如果你已经基于多种操作系统的 C socket api 直接编写过各种复杂的网络程序,那学习 asio 时,自然地感觉简单些。而你还在发晕 “咦?为什么服务端只需要一个端口……”这类基本概念问题,自然学习 asio 就难了些。

学习次序:当然应该先学扎实了 c++的知识,再学STL,这其中就有从boost中招安过来的东西,最后再去挑着学习 http://boost.XXX或boost.YYY。

举个例子:从 C++ 到 boost.asio 异步网络编程 ,比如如何一头用 GUI 写一个图形界面的 网络聊天 客户端 ,另一头用 boost.asio 写一个 网络聊天服务端,整个路程是比较远的,但我的书有安排了合理的学习路线,从纯C++的玩具例程,到真实的网络并发编程,中间还夹着跨平台的图形用户界面编程 ……没有路线怎么高效?

3.5 boost发展前景

不能太神化 boost库,但也完全不用去担心它的前景。boost会一直是C++标准库(长期)无法拥有的,但业务上又太需要的一些功能的试验地。比如,去年还是前年, boost.mysql 也终于来了。

有人可能也注意前面回答中提到的 boost.Coroutine 和 boost.Coroutine2,boost.variant 和 boost.variant2 ,以及 boost.lambda 和 boost.lambda2 的名字。没错,boost似乎只有认真的进入机制而没有严肃的退出机制(但好像文档里有标明 deprecated )。所以从发展前景来看,boost库在一边继续有新的库进入C++标准,但肯定也会更多的现有的一些库,要进入“deprecated”。这当然正是boost作为标准库的“预备库”应有好处:该活的活,该死的死;同时也让用户更放心 boost 的发展。