Posted on 2008-09-12 21:10
海邊沫沫 閱讀(7835)
評論(8) 編輯 收藏 引用 所屬分類:
高起點(diǎn)C++學(xué)習(xí)之路
Scott Meyers在他的著名作品《Effective C++》中的第54條寫道:“Familiarize yourself with the standard library, including TR1“,同時在第55條寫道:“Familiarize yourself with Boost“,而這些條款的具體內(nèi)容中,又說道C++0x 或許會覆蓋某些有趣的語言新特性,但大部分新技能將以標(biāo)準(zhǔn)程序庫的擴(kuò)充形式體現(xiàn),同時不斷強(qiáng)調(diào)Boost是一個高質(zhì)量、源代碼開放、跨平臺、兼容多個編譯器的程序庫。于是,我終于痛下決心,花大力氣來學(xué)習(xí)TR1和Boost。
難道學(xué)習(xí)學(xué)習(xí)這幾個庫就真的這么難嗎?其實(shí)也不一定很難,但是也絕對不簡單。我之所以搞得一副壯士一去不復(fù)返的樣子,那也是有原因的。其中的一個原因是有點(diǎn)被別人誤導(dǎo),當(dāng)我在網(wǎng)上搜索Boost相關(guān)的文章時,經(jīng)常看到有人寫編譯Boost時遇到這樣那樣的錯誤,以至于我以為裝個Boost比裝一個操作系統(tǒng)還難。事實(shí)上根本不是這樣,Boost的下載很簡單,直接到http://www.boost.org就可以下載最新版本,用起來也不難,大部分的功能都只需要包含Boost的頭文件就可以了,只有極少數(shù)的庫庫要預(yù)編譯,即使是預(yù)編譯,也基本上沒啥門檻,網(wǎng)上寫的那些這樣那樣的問題我也沒遇到,Boost的最新版本和我的Visual Studiao 2008就相處得很好,沒有編譯器兼容的問題。我下載的是1.36.0版,下載下來是50多M,解壓縮后是200多M。打開控制臺,輸入以下命令,就可以完成了Boost的預(yù)編譯:
cd?D:\boost_1_36_0
cd?tools\jam\src
build?
這里我是把Boost解壓在了D盤,運(yùn)行上面的命令后,等一下下,就有一個叫bjam.exe的工具被編譯出來了。然后,把這個工具考貝到D:\boost_1_36_0目錄下,以一定的命令行選項運(yùn)行該工具,就可以完成Boost的預(yù)編譯了。命令如下:
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的文檔抄的,沒什么技術(shù)含量,只要會用Windows的命令行誰都可以搞定。以后使用Boost的時候,如果哪個庫需要連接編譯出來的二進(jìn)制庫,只需要在Visual Studio 2008中指定項目的Additional Library Directories 為 D:\boost_1_36_0\stage\lib 就可以了。這個步驟文檔是寫得很清楚的。上面的代碼大家不要復(fù)制,因?yàn)檫@個博客系統(tǒng)的編輯器向里面加了一些空格,直接運(yùn)行有可能會出錯的。
至于TR1的獲得就更加簡單了,Visual Studio 2008推出后不久,就推出了一個Feature Pack,是可以在微軟的官方網(wǎng)站上免費(fèi)下載的,其中就包含有TR1,同時還有MFC的新的界面庫,MFC的fans們早就笑得合不攏嘴了。這個Feature Pack安裝以后就可以直接在Visual Studio 2008中使用TR1。不過文檔需要單獨(dú)下載。
為什么說絕對不簡單呢?還是從Boost說起:
第一,Boost編譯時的時間占用和空間占用是絕對不簡單的。我的臺式機(jī)是扣肉的CPU加4G的內(nèi)存,編譯了接近一個小時,而我另外一臺筆記本,是賽揚(yáng)2.4G的CPU加1G的內(nèi)存,編譯到半夜我睡一覺醒來它才完成工作。而硬盤上怎么也得準(zhǔn)備7G的空間,編譯完成后,可以刪除D:\build-boost目錄,但是Boost庫占用的空間依然超過3G。
第二,再來說說學(xué)習(xí)的時間占用。Boost的文檔是寫得相當(dāng)?shù)暮玫模任④浱峁┑腡R1文檔強(qiáng)太多了,每一個功能的文檔都會說明它實(shí)現(xiàn)了什么功能,還會說明以前的標(biāo)準(zhǔn)庫有哪些不足,這對我這樣超級期待C++ 0x的人來說,是莫大的福音。其次,Boost的文檔都寫得循序漸漸,讀起來才像文章,而微軟的東西,到處都是超級連接跳來跳去像意大利面條。但是,有好的文檔就一定學(xué)起來簡單嗎?我初步數(shù)了一下,目前版本的Boost足足有80多個功能單元,如果我能夠每天讀一篇文檔的話,那也得接近三個月。就算是每天讀一篇文檔,也不是很現(xiàn)實(shí)的,因?yàn)橛袝r我還要抽時間打打牌。就算我不打牌,也有一些比較大的功能單元,如Boost.Regex、Boost.Python,它們的內(nèi)容都是足夠?qū)懸槐緯模屛乙惶熳x完也太有難度了吧。另外,很多庫需要專業(yè)知識做基礎(chǔ),當(dāng)我讀Accumulator和Math的文檔時,可能還得說“兄弟,把你的《統(tǒng)計學(xué)》和《高等數(shù)學(xué)》借給我翻翻”。
微軟的TR1文檔我已經(jīng)學(xué)習(xí)得差不多了,只剩Random的文檔還沒有讀。而Boost的文檔,我今天讀了Accumulators。也許有人會奇怪,為什么不是Function、Bind、Lambda這些流行的呢,難道你是搞統(tǒng)計的?事實(shí)上不是這樣,因?yàn)槟切┝餍械臇|西已經(jīng)被大家寫爛了,讀中文的東西要方便得多,再就是按字母表排序Accumulators也是排在首位的嘛,我就按字母表慢慢讀下去算了。
讀了Accumulators的文檔,當(dāng)然會有一些感想。首先就是感覺這的確是個好東西,設(shè)計得很優(yōu)雅,用起來也很方便,當(dāng)我熟悉了它的一些概念后,我就在想,以后搞統(tǒng)計分析方便了,不用再打開WPS表格對著課本編輯公式,不用再對著單元格輸入數(shù)據(jù),輸一個數(shù)還得按一下方向鍵才能跳到另外一個單元格。如果能用自己寫的C++來搞統(tǒng)計分析,只用把所有的數(shù)據(jù)輸入到記事本,用命令行的管道輸入就可以了,而且自己寫程序搞統(tǒng)計分析倍有面子,比使用Analysis有面子多了。但是理想和現(xiàn)實(shí)還是有距離的,當(dāng)我讀到它自帶的statistical accumulators有哪些時,我又失望了,我總不能只用它來求最大值最小值和平均值吧,對于方差分析、卡方檢驗(yàn)、t檢驗(yàn)、u檢驗(yàn)它都沒有提供,當(dāng)然,它的設(shè)計是很有彈性的,我可以自己擴(kuò)充嘛。自己擴(kuò)充……也不是不行,不過那個難度……,我還不如用WPS表格來對著單元格來編輯公式呢。
另外一個感想就是覺得Boost真的是有翻天覆地之能,顛覆了很多傳統(tǒng)的東西,比如我在看Accumulators文檔時看到的這樣的代碼:
accumulator_set
<
?
double
,?features
<
?my_tail_variate_tag?
>
?
>
?acc(?tag::tail
<
left
>
::cache_size?
=
?
2
?);

acc(?
1.2
,?covariate1?
=
??
12
?);
這時,我的人肉編譯就不靈光了,以前哪里見過這樣在傳遞參數(shù)的時候還帶名字的呢?不過,文檔中寫道,這叫命名參數(shù),是由Boost.Parameter庫實(shí)現(xiàn)的功能。真的是又長見識了,看來Boost帶給C++0x的可能不僅僅只是庫上面的擴(kuò)充,對語言特性可能也會有一些影響,比如Concept,比如右值引用。這些東西我現(xiàn)在也講不清楚,但不管怎么說,Boost讓我覺得它真是一個挖不完的大金礦,我們肯定能在里面找到一些新奇而有趣的東西。
兄弟們,加油,一起向Boost進(jìn)軍吧!