天天看點

C++強大的背後

來源:http://www.cnblogs.com/miloyip/archive/2010/09/17/1828449.html

C++并非萬能丹,我按經驗舉出一些C++的适用時機。

C++适合構造程式中需求較穩定的部分,需求變化較大的部分可使用腳本語言;

程式須盡量發揮硬體的最高性能,且性能瓶頸在于CPU和記憶體;

程式須頻繁地與作業系統或硬體溝通;

程式必須使用C++架構/庫,如大部分遊戲引擎(如Unreal/Source)及中間件(如Havok/FMOD),雖然有些C++庫提供其他語言的綁定,但通常原生的API性能最好、最新;

項目中某個目标平台隻提供C++編譯器的支援。

按應用領域來說,C++适用于開發伺服器軟體、桌面應用、遊戲、實時系統、高性能計算、嵌入式系統等。

C++有不錯的跨平台能力,但由于直接映射硬體,因性能優化的關系,跨平台能力不及Java及多數腳本語言。然而,實踐跨平台的C++軟體還是可行的,但須注意以下問題:

C++标準沒有規定原始資料類型(如int)的大小,需要特定大小的類型時,可自訂類型(如int32_t),同時對任何類型使用sizeof()而不假設其大小;

位元組序(byte order)按CPU有所不同,特别要注意二進制輸入輸出、reinterpret_cast法;

原始資料和結構類型的位址對齊有差異;

編譯器提供的一些編譯器或平台專用擴充指令;

總括而言,跨平台C++軟體可在頭檔案中用宏檢測編譯器和平台,再用宏、typedef、自定平台相關實作等方法去實踐跨平台,C++标準不會提供這類幫助。

C++同時提供在堆棧上的自動局部變量,以及從自由存儲(free store)配置設定的對象。對于後者,程式員需手動釋放,或使用不同的容器和智能指針。 C++程式員經常進一步優化記憶體,自定義記憶體配置設定政策以提升效能,例如使用對象池、自定義的單向/雙向堆棧區等。雖然C++0x還沒加入GC功能,但也可 以自行編寫或使用現成庫。此外,C/C++也可以直接使用作業系統提供的記憶體相關功能,例如記憶體映射檔案、共享記憶體等。

雖然C++已經非常複雜,但仍缺少很多常見功能。 C++0x作出了不少改善,例如語言方面加入Lambda函數、閉包、類型推導聲明等,而庫方面則加入正規表達式、采用哈希表的 unordered_set/unordered_map、引用計數智能指針shared_ptr/weak_ptr等。但最值得留意的是C++0x引入 多線程的文法和庫功能,這是C++演進的一大步。然而,模組、GC、反射機制等功能雖有提案,卻未加進C++0x。

我同意Stroustrup關于使用C++各種技術的回應:“你可以做,不意味着你必須這麼做。(Just because you can do it, doesn't mean that you have to.)” C++充滿豐富的特性,但同時帶來不同問題,例如過分複雜、編譯及運作性能的損耗。一般可考慮是否使用多重繼承、異常、RTTI,并調節使用模版及模版元 程式設計的程度。使用過分複雜的設計和功能,可能會令部分團隊成員更難了解和維護。

C++的編碼自由度很高,容易編寫風格迥異的代碼,C++本身也沒有定義一些标準規範。而且,C++的源檔案實體構成,較許多語言複雜。是以,除了決定特性集,每個團隊應建立一套程式設計規範,包括源檔案格式(可使用檔案模版)、花括号風格。

由于C++有對C相容的包袱,一些功能可以使用C風格實作,但最好使用C++提供的新功能。最基本的是盡量以具名常量、内聯函數和泛型取代宏,隻把 宏用在條件式編譯及特殊情況。舊式的C要求局部變量聲明在作用域開端,C++則無此限制,應把變量聲明盡量置于鄰近其使用的地方,for()的循環變量聲 明可置于for的括号内。 C++中能加強類型安全的功能應盡量使用,例如避免“萬能”指針void *,而使用個别或泛型類型;用bool而非int表示布爾值;選用4種C++ cast關鍵字代替簡單的強制轉換。

由于我主要是應用C++,大約隻停留于第二、三個層次。然而,C++隻是軟體開發的一環而已,單憑語言并不能應付業務和工程上的問題。建議讀者不要 強求幾年内“徹底學會C++的知識”,到達第二層左右便從工作實戰中汲取經驗,有興趣才慢慢繼續學習更高層次的知識。雖然學習C++有難度,但也是相當有 趣且有滿足感的。

數十年來,C++雖有起伏,但她依靠其使用者而不斷得到頑強的生命力,相信在我退休之前都不會與她分離,也希望更進一步了解她,與她走進未來。

本文轉自夏雪冬日部落格園部落格,原文連結:http://www.cnblogs.com/heyonggang/archive/2013/04/28/3049393.html,如需轉載請自行聯系原作者