學習如何以C++設計並實現高效程序是另外一回事

chchwy 發表於 2015-11-04

好讀版 http://chchwy.blogspot.com/2011/01/effective-c-3ed.html
我一直在想該怎麼替這本書下註腳,後來決定開宗名義的引用Effective C++第一章第一句話:『學習語言的根本大法是一回事,學習如何以某種語言設計並實現高效程序則是另外一回事。』講的好。

經驗老到的程式員的另一個意思就是踩過夠多的地雷;地雷意指程式語言中的陰暗角落,這些小問題曾經導致我坐在電腦之前搔掉好幾根頭毛,狼狽的耗費大量時間。這些經驗很寶貴,很多書教新語法、新功能,但願意傳授經驗,提醒你繞開陷阱的書卻不多。

Effective C++就是這樣一本書,哦,挖出C++的各種骯髒部份,一清二楚地攤在陽光下。C++是個複雜的語言,提供很多機制。但是許多時候 C++允許你這樣寫,並不代表你應該這樣寫,若不認識語言背後設計的理念,那麼誤用的機會很大。我寫過不少 C++ 程式,但是列出來的幾個地雷案例還是讓我嚇了一跳。

看著書裡一些條款,我覺得 C++ 這個語言為了維護「使用者不該為他沒有用到的功能付出效率的代價」的理念,發展出十足的細節,比方說一塊 new 分派的記憶體空間,必須不偏不倚剛好 delete 一次,忘了detele會 memory leaking,delete 多於一次又可能出問題。於是為了確保正確釋放資源,書中花費十幾個條款探討各種狀況,各種怪招,資源管理物件、autoptr、shareptr全都出籠,為的就是彌補C++天生的語言缺陷。類似的細節還有成員函式inline、non-virtual、pure virtual、non-pure virtual 之間的差異引發的細節問題,實在超乎想像。我明白這是C++的歷史包袱,不過為了一點點效能把問題搞得如此複雜,真的值得嗎?

看清 C++ 語言充滿缺陷的黑暗面後,我其實有些沮喪,許多問題轉來轉去,最後只有無奈的說:沒有辦法適當地解決。這樣看後繼者 Java 的改革很多的確切中時弊。不過再看看今天眾多對Java的批評,我發現語言很難完美,C++提供高級抽象的同時又試圖保有最佳的執行效率,代價就是複雜;Java讓語言簡單,代價就是不夠靈活。除了適當地時機挑選適當地語言,還要正確的認識語言的優點與缺點。

我個人覺得不錯的條款列在下面:
條款01:視C++為聯合國。C++是由四種不同風格組合而成的混血語言,這解答了我一個疑惑,怎麼每翻開一本新書,就發現原來我還不會寫C++,而且不同的風格偶爾還會打架。
條款03:深入探討const的各種用法跟意義,還有可能的問題,值得一看。
條款13、14、15、17:各種智慧型指標的用法,以及力有未逮之處。
條款22、23:對於封裝的權限有一番探討,一句話解釋封裝:「當其內容改變時可能造成的代碼破壞量」,太中肯了。
條款32~40:把C++的繼承從裡面翻到外面,每個細節都看過了。我認為最有價值的是解釋了繼承的各種用途跟意義,哦,還有陷阱。

有些條款時候未到,我還沒有很深的體會。想起二年前我第一次翻開Effective C++,看不到十頁就棄械投降,今天卻看得津津有味,實戰經驗傳承的書,還是必須有足夠的經歷才能感受的深阿。

請先登入會員,才可回應。

登入 / 註冊

會員中心