用Boost写的代码阅读和维护过好几年了,但用在自己项目里还是第一次。过去几周把P2P-Tuple软件大改了一下,架构方面改动的同时也改用boost来做诸如serialisation, multi-threading, interprocess communication,filesystem的任务,简单谈一下第一印象:
首先,boost很OO,这点毋庸置疑,阅读boost代码本身会有很好的收益。boost也“比较”标准,朝中有人好说话,标准由boost的作者制定,boost就是标准。
其次,boost总体上来说比较简单高效,多数情况也能应付很多软件的可移植性,比如libtorrent这样的例子。
boost的缺点是:
1. bjam很不标准,--help里也看不到是否支持并行编译。
2. 文档不全,和java库比,文档全面和可读性都差多了。
3. 居然不支持multi-process,但却支持IPC。
就比如boost用的bjam设置安装路径用一个配置文件,一个bootstrap.sh脚本来配置这个配置文件,--prefix居然是安装头文件的路径,必须--libdir分开单独指定库安装路径。这个细节上干嘛就不能和automake/autoconf做的兼容呢?这么简单一个细节,举手之劳而已。
昨天经过仔细思考,也放弃了把P2P-Tuple移植到windows上的想法,剩下基本就一个fork/waitpid是posix的了,自己包装一下很容易就能搞定,剩下的繁琐的简单校调没有任何挑战,时间还是花在已经落后了的MapReduce的支持上比较合理。顺便提一下apache的apr库,很垃圾的一个库,基本每个函数都要一个pool*的参数。本来打算用它做P2P-Tuple的跨平台支持,一看这个接口质量直接放弃了,后来一google,其作者也承认这个pool*的设计是apr最大的错误 -- 你会愿意在程序开头创建一个memory pool,然后把它传遍程序所有用到操作系统API的地方吗,(请注意,apr本身就可以认为是一个操作系统api的抽象层,不应该再加一层了)?