Posted on 2008-09-12 21:10
海边沫沫 阅读(7799)
评论(8) 编辑 收藏 引用 所属分类:
高起点C++学习之路
Scott Meyers在他的著名作品《Effective C++》中的第54条写道:“Familiarize yourself with the standard library, including TR1“,同时在第55条写道:“Familiarize yourself with Boost“,而这些条款的具体内容中,又说道C++0x 或许会覆盖某些有趣的语言新特性,但大部分新技能将以标准程序库的扩充形式体现,同时不断强调Boost是一个高质量、源代码开放、跨平台、兼容多个编译器的程序库。于是,我终于痛下决心,花大力气来学习TR1和Boost。
难道学习学习这几个库就真的这么难吗?其实也不一定很难,但是也绝对不简单。我之所以搞得一副壮士一去不复返的样子,那也是有原因的。其中的一个原因是有点被别人误导,当我在网上搜索Boost相关的文章时,经常看到有人写编译Boost时遇到这样那样的错误,以至于我以为装个Boost比装一个操作系统还难。事实上根本不是这样,Boost的下载很简单,直接到http://www.boost.org就可以下载最新版本,用起来也不难,大部分的功能都只需要包含Boost的头文件就可以了,只有极少数的库库要预编译,即使是预编译,也基本上没啥门槛,网上写的那些这样那样的问题我也没遇到,Boost的最新版本和我的Visual Studiao 2008就相处得很好,没有编译器兼容的问题。我下载的是1.36.0版,下载下来是50多M,解压缩后是200多M。打开控制台,输入以下命令,就可以完成了Boost的预编译:
cd D:\boost_1_36_0
cd tools\jam\src
build
这里我是把Boost解压在了D盘,运行上面的命令后,等一下下,就有一个叫bjam.exe的工具被编译出来了。然后,把这个工具考贝到D:\boost_1_36_0目录下,以一定的命令行选项运行该工具,就可以完成Boost的预编译了。命令如下:
cd D:\boost_1_36_0
copy tools\jam\src\bin.ntx86\bjam.exe .
bjam --build-dir
=
"
D:\build-boost
"
--toolset
=
msvc --build-type
=
complete stage
这些命令都是照着Boost的文档抄的,没什么技术含量,只要会用Windows的命令行谁都可以搞定。以后使用Boost的时候,如果哪个库需要连接编译出来的二进制库,只需要在Visual Studio 2008中指定项目的Additional Library Directories 为 D:\boost_1_36_0\stage\lib 就可以了。这个步骤文档是写得很清楚的。上面的代码大家不要复制,因为这个博客系统的编辑器向里面加了一些空格,直接运行有可能会出错的。
至于TR1的获得就更加简单了,Visual Studio 2008推出后不久,就推出了一个Feature Pack,是可以在微软的官方网站上免费下载的,其中就包含有TR1,同时还有MFC的新的界面库,MFC的fans们早就笑得合不拢嘴了。这个Feature Pack安装以后就可以直接在Visual Studio 2008中使用TR1。不过文档需要单独下载。
为什么说绝对不简单呢?还是从Boost说起:
第一,Boost编译时的时间占用和空间占用是绝对不简单的。我的台式机是扣肉的CPU加4G的内存,编译了接近一个小时,而我另外一台笔记本,是赛扬2.4G的CPU加1G的内存,编译到半夜我睡一觉醒来它才完成工作。而硬盘上怎么也得准备7G的空间,编译完成后,可以删除D:\build-boost目录,但是Boost库占用的空间依然超过3G。
第二,再来说说学习的时间占用。Boost的文档是写得相当的好的,比微软提供的TR1文档强太多了,每一个功能的文档都会说明它实现了什么功能,还会说明以前的标准库有哪些不足,这对我这样超级期待C++ 0x的人来说,是莫大的福音。其次,Boost的文档都写得循序渐渐,读起来才像文章,而微软的东西,到处都是超级连接跳来跳去像意大利面条。但是,有好的文档就一定学起来简单吗?我初步数了一下,目前版本的Boost足足有80多个功能单元,如果我能够每天读一篇文档的话,那也得接近三个月。就算是每天读一篇文档,也不是很现实的,因为有时我还要抽时间打打牌。就算我不打牌,也有一些比较大的功能单元,如Boost.Regex、Boost.Python,它们的内容都是足够写一本书的,让我一天读完也太有难度了吧。另外,很多库需要专业知识做基础,当我读Accumulator和Math的文档时,可能还得说“兄弟,把你的《统计学》和《高等数学》借给我翻翻”。
微软的TR1文档我已经学习得差不多了,只剩Random的文档还没有读。而Boost的文档,我今天读了Accumulators。也许有人会奇怪,为什么不是Function、Bind、Lambda这些流行的呢,难道你是搞统计的?事实上不是这样,因为那些流行的东西已经被大家写烂了,读中文的东西要方便得多,再就是按字母表排序Accumulators也是排在首位的嘛,我就按字母表慢慢读下去算了。
读了Accumulators的文档,当然会有一些感想。首先就是感觉这的确是个好东西,设计得很优雅,用起来也很方便,当我熟悉了它的一些概念后,我就在想,以后搞统计分析方便了,不用再打开WPS表格对着课本编辑公式,不用再对着单元格输入数据,输一个数还得按一下方向键才能跳到另外一个单元格。如果能用自己写的C++来搞统计分析,只用把所有的数据输入到记事本,用命令行的管道输入就可以了,而且自己写程序搞统计分析倍有面子,比使用Analysis有面子多了。但是理想和现实还是有距离的,当我读到它自带的statistical accumulators有哪些时,我又失望了,我总不能只用它来求最大值最小值和平均值吧,对于方差分析、卡方检验、t检验、u检验它都没有提供,当然,它的设计是很有弹性的,我可以自己扩充嘛。自己扩充……也不是不行,不过那个难度……,我还不如用WPS表格来对着单元格来编辑公式呢。
另外一个感想就是觉得Boost真的是有翻天覆地之能,颠覆了很多传统的东西,比如我在看Accumulators文档时看到的这样的代码:
accumulator_set
<
double
, features
<
my_tail_variate_tag
>
>
acc( tag::tail
<
left
>
::cache_size
=
2
);
acc(
1.2
, covariate1
=
12
);
这时,我的人肉编译就不灵光了,以前哪里见过这样在传递参数的时候还带名字的呢?不过,文档中写道,这叫命名参数,是由Boost.Parameter库实现的功能。真的是又长见识了,看来Boost带给C++0x的可能不仅仅只是库上面的扩充,对语言特性可能也会有一些影响,比如Concept,比如右值引用。这些东西我现在也讲不清楚,但不管怎么说,Boost让我觉得它真是一个挖不完的大金矿,我们肯定能在里面找到一些新奇而有趣的东西。
兄弟们,加油,一起向Boost进军吧!