亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++強大的背后

2019-11-08 03:09:03
字體:
來源:轉載
供稿:網友

在31年前(1979年),一名剛獲得博士學位的研究員,為了開發一個軟件項目發明了一門新編程語言,該研究員名為Bjarne Stroustrup,該門語言則命名為——C with classes,四年后改稱為C++。C++是一門通用編程語言,支持多種編程范式,包括過程式、面向對象(object-oriented PRogramming, OP)、泛型(generic programming, GP),后來為泛型而設計的模版,被發現及證明是圖靈完備的,因此使C++亦可支持模版元編程范式(template metaprogramming, TMP)。C++繼承了C的特色,既為高級語言,又含低級語言功能,可同時作為系統和應用編程語言。

C++廣泛應用在不同領域,使用者以數百萬計。根據近十年的調查,C++的流行程度約穩定排行第3位(于C/java之后)。 C++經歷長期的實踐和演化,才成為今日的樣貌。1998年,C++標準委員會排除萬難,使C++成為ISO標準(俗稱C++98),當中含非常強大的標準模版庫(standard template library, STL)。之后委員會在2005年提交了有關標準庫的第一個技術報告(簡稱TR1),并為下一個標準C++0x而努力。可惜C++0x并不能在200x年完成,各界希望新標準能于2011年內出臺。

流行的C++編譯器中,微軟Visual C++ 2010已實現部分C++0x語法并加入TR1擴充庫,而gcc對C++0x語法和庫的支持比VC2010更多。 1 應否選擇C++ 1.1 哪些程序適宜使用C++? C++并非萬能丹,我按經驗舉出一些C++的適用時機。

C++適合構造程序中需求較穩定的部分,需求變化較大的部分可使用腳本語言;程序須盡量發揮硬件的最高性能,且性能瓶頸在于CPU和內存;程序須頻繁地與操作系統或硬件溝通;程序必須使用C++框架/庫,如大部分游戲引擎(如Unreal/Source)及中間件(如Havok/FMOD),雖然有些C++庫提供其他語言的綁定,但通常原生的API性能最好、最新;項目中某個目標平臺只提供C++編譯器的支持。

按應用領域來說,C++適用于開發服務器軟件、桌面應用、游戲、實時系統、高性能計算、嵌入式系統等。 1.2 使用C++還是C? C++和C的設計哲學并不一樣,兩者取舍不同,所以不同的程序員和軟件項目會有不同選擇,難以一概而論。與C++相比,C具備編譯速度快、容易學習、顯式描述程序細節、較少更新標準(后兩者也可同時視為缺點)等優點。在語言層面上,C++包含絕大部分C語言的功能(例外之一,C++沒有C99的變長數組VLA),且提供OOP和GP的特性。但其實用C也可實現OOP思想,亦可利用宏去實現某程度的GP,只不過C++的語法能較簡潔、自動地實現OOP/GP。C++的RAII(resource acquisition is initialization,資源獲取就是初始化)特性比較獨特,C/C#/Java沒有相應功能。回顧歷史,Stroustrup開發的早期C++編譯器Cpre/Cfront是把C++源代碼翻譯為C,再用C編譯器編譯的。由此可知,C++編寫的程序,都能用等效的C程序代替,但C++在語言層面上提供了OOP/GP語法、更嚴格的類型檢查系統、大量額外的語言特性(如異常、RTTI等),并且C++標準庫也較豐富。有時候C++的語法可使程序更簡潔,如運算符重載、隱式轉換。但另一方面,C語言的API通常比C++簡潔,能較容易供其他語言程序調用。因此,一些C++庫會提供C的API封裝,同時也可供C程序調用。相反,有時候也會把C的API封裝成C++形式,以支持RAII和其他C++庫整合等。

1.3 為何C++性能可優于其他語言?

相對運行于虛擬機語言(如C#/Java),C/C++直接以靜態形式把源程序編譯為目標平臺的機器碼。一般而言,C/C++程序在編譯及鏈接時可進行的優化最豐富,啟動時的速度最快,運行時的額外內存開銷最少。而C/C++相對動態語言(如Python/Lua)也減少了運行時的動態類型檢測。此外,C/C++的運行行為是確定的,且不會有額外行為(例如C#/Java必然會初始化變量),也不會有如垃圾收集(GC)而造成的不確定性延遲,而且C/C++的數據結構在內存中的布局也是確定的。有時C++的一些功能會使程序性能優于C,當中以內聯和模版最為突出,這兩項功能使C++標準庫的sort()通常比C標準庫的qsort()快多倍(C可用宏或人手編碼去解決此問題)。另一方面,C/C++能直接映射機器碼,之間沒有另一層中間語言,因此可以做底層優化,例如使用內部(intrinsic)函數和嵌入匯編語言。然而,許多C++的性能優點并非免費午餐,代價包括較長的編譯鏈接時間和較易出錯,因而增加開發時間和成本,這點稍后補充。

我進行了一個簡單全局渲染性能測試(512x512像素,每像素10000個采樣),C++ 1小時36分、Java 3小時18分、Python約18天、Ruby約351天。評測方式和其他語言的結果詳見博文。

2 C++常見問題 2.1 C++源代碼跨平臺嗎?

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

C++標準沒有規定原始數據類型(如int)的大小,需要特定大小的類型時,可自訂類型(如int32_t),同時對任何類型使用sizeof()而不假設其大??;字節序(byte order)按CPU有所不同,特別要注意二進制輸入輸出、reinterpret_cast法;原始數據和結構類型的地址對齊有差異;編譯器提供的一些編譯器或平臺專用擴充指令;避免作應用二進制接口(application binary interface,ABI)的假設,例如調用函數時參數的取值順序在C/C++中沒定義,在C++中也不可隨便假設RTTI/虛表等實現方式。

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

2.2 C++程序容易崩潰?

和許多語言相比,C/C++提供不安全的功能以最優化性能,有可能造成崩潰。但要注意,很多運行時錯誤,如向空指針/引用解引用、數組越界、堆棧溢出等,其他語言也會報錯或拋出異常,這些都是程序問題,而不是語言本身的問題。有些意見認為,出現這類運行時錯誤,應該盡量寫入日志并立即崩潰,不該讓程序繼續運行,以免造成更大的影響(例如程序繼續把內存中錯誤的數據覆寫文件)。若要容錯,可按業務把程序分割為多進程,像Chrome或使用fork()的形式。然而,C++有許多機制可以減少錯誤,例如以string代替C字符串;以vector或array(TR1)代替原始數組(有些實現可在調試模式檢測越界);使用智能指針也能減少一些原始指針的問題。另外,我最常遇到的Bug,就是沒有初始化成員變量,有時會導致崩潰,而且調試版和發行版的行為可能不同。

2.3 C++要手動做內存管理?

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

2.4 使用C++常要重造輪子?

我曾參與的C++項目,都會重造不少標準庫已提供的功能,此情況在其他語言中較少出現。我試圖分析個中原因。首先,C++標準庫相對很多語言來說是貧乏的,各開發者便會重復地制造自訂庫。從另一個角度看,C++標準庫是用C++編寫的(很多其他語言不用自身而是用C/C++去編寫庫),在能力和性能上,自訂庫和標準庫并無本質差別;另外,標準庫為通用而設,對不同平臺及多種使用需求作取舍,性能上有所影響,例如EA公司就曾發表自制的EASTL規格,描述游戲開發方面對STL的性能及功能需求的特點;此外,多個C++庫一起使用,經常會因規范不同而引起沖突,又或功能重疊,所以項目可能須自行開發,或引入其他庫的概念或實現(如Boost/TR1/Loki),改寫以符合項目規范。

2.5 C++編譯速度很慢?

錯,是非常慢。我認為C++可能是實用程序語言中編譯速度最慢的。此問題涉及C++沿用C的編譯鏈接方式,又加入了復雜的類/泛型聲明和內聯機制,使編譯時間倍增。在C++對編譯方法改革之前(如module提案),可使用以下技巧改善:第一,使用pimpl手法,因性能損耗應用于調用次數不多的類;第二,僅包含必要頭文件,并盡量使用及提供前置聲明版本的頭文件(如iosfwd);第三采用基于接口的設計,但須注意虛函數調用成本;第四,采用unity build,即把多個cpp文件結合在一個編譯單元進行編譯;第五,采用分布式生成系統如IncrediBuild。

2.6 C++缺乏什么功能?

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

3 C++使用建議

3.1 為應用挑選特性集

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

3.2 為團隊建立編程規范

C++的編碼自由度很高,容易編寫風格迥異的代碼,C++本身也沒有定義一些標準規范。而且,C++的源文件物理構成,較許多語言復雜。因此,除了決定特性集,每個團隊應建立一套編程規范,包括源文件格式(可使用文件模版)、花括號風格。

3.3 盡量使用C++風格而非C風格

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

3.4 結合其他語言

如前文所述,C++并非適合所有應用情境,有時可以混合其他語言使用,包括用C++擴展其他語言,或在C++程序中嵌入腳本語言引擎。對于后者,除了使用各種腳本語言的專門API,還可使用Boost或SWIG作整合。

4 C++學習建議

C++缺點之一,是相對許多語言復雜,而且難學難精。許多人說學習C語言只需一本K&R《C程序設計語言》即可,但C++書籍卻是多不勝數。我是從C進入C++,皆是靠閱讀自學。在此分享一點學習心得。個人認為,學習C++可分為4個層次:

第一層次,C++基礎:挑選一本入門書籍,如《C++ Primer》、《C++大學教程》、或Stroustrup撰寫的經典《C++程序設計語言》或他一年半前的新作《C++程序設計原理與實踐》,而一般C++課程也止于此,另外《C++標準程序庫》及《The C++ Standard Library Extensions》可供參考;第二層次,正確高效地使用C++:此層次開始必須自修,閱讀過《(More)Effective C++》、《(More)Exceptional C++》、《Effective STL》及《C++編程規范》等,才適宜踏入專業C++開發之路;第三層次,深入了解C++:關于全局問題可讀《深入探索C++對象模型》、《Imperfect C++》、《C++沉思錄》、《STL源碼剖析》,要挑戰智商,可看關于模版及模版元編程的書籍如《C++ Templates》、《C++設計新思維》、《C++模版元編程》;第四層次,研究C++:閱讀《C++語言的設計和演化》、《編程的本質》(含STL設計背后的數學根基)、C++標準文件《ISO/IEC 14882:2003》、C++標準委員會的提案書和報告書、關于C++的學術文獻。

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

數十年來,C++雖有起伏,但她依靠其使用者而不斷得到頑強的生命力,相信在我退休之前都不會與她分離,也希望更進一步了解她,與她走進未來。 原文地址: http://www.cnblogs.com/miloyip/archive/2010/09/17/1828449.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
68精品久久久久久欧美| 久久久噜噜噜久噜久久| 国产精品精品一区二区三区午夜版| 成人免费视频网| 精品久久久久久久中文字幕| 成人写真视频福利网| 亚洲天堂免费观看| 国产精品99久久久久久久久| 国产精品亚洲片夜色在线| 成人一区二区电影| 亚洲美女黄色片| 一夜七次郎国产精品亚洲| 久久久久国产精品一区| 国产成人av在线| 日韩亚洲欧美中文在线| 欧美不卡视频一区发布| 欧美一区二区影院| 国产在线观看一区二区三区| 欧美精品情趣视频| 日韩精品极品视频| 国产欧美日韩丝袜精品一区| 精品久久久久久| 欧美午夜女人视频在线| 欧美成人精品在线播放| 日韩中文字幕视频在线| 国产亚洲欧洲黄色| 91高清免费在线观看| 亚洲一区二区中文字幕| 亚洲国产精品va| 日韩在线视频免费观看| 成人免费观看49www在线观看| 国产精品18久久久久久麻辣| 国产视频精品免费播放| 精品国产91乱高清在线观看| 亚洲无限av看| 久久影视电视剧免费网站清宫辞电视| 亚洲一区二区三区毛片| 国产精品自拍偷拍视频| 欧美精品免费看| 久久久久久久成人| 亚洲福利视频网站| 欧美综合国产精品久久丁香| 日韩视频免费在线观看| 国产精品偷伦视频免费观看国产| 日韩av电影国产| 精品动漫一区二区| 岛国av一区二区在线在线观看| 91国产美女在线观看| 欧美成人午夜激情在线| 欧美黑人性视频| 国产一区二区三区18| 日韩美女福利视频| 欧美电影免费观看高清完整| 日韩人体视频一二区| 国产精品久久97| 国产精品高潮呻吟久久av黑人| 亚洲男人的天堂在线播放| 国产精品在线看| 在线国产精品播放| 日韩欧美第一页| 日本aⅴ大伊香蕉精品视频| 亚洲激情电影中文字幕| 欧美巨猛xxxx猛交黑人97人| 日韩欧美中文字幕在线观看| 国产亚洲欧美日韩精品| 国产欧美日韩中文字幕| 亚洲福利在线视频| 国产日韩精品一区二区| 国内精品久久影院| 91精品久久久久久久久久久久久| 久久亚洲综合国产精品99麻豆精品福利| 亚洲性猛交xxxxwww| 亚洲丝袜一区在线| 国产精品1区2区在线观看| 成人免费观看网址| 久久成人国产精品| 国产成人a亚洲精品| 51久久精品夜色国产麻豆| 日韩在线观看网站| 91精品啪aⅴ在线观看国产| 97福利一区二区| 国产精品久久久久久久久久| 国产精品久久综合av爱欲tv| 国产精品成人av在线| 国产精品久久久久高潮| 91av国产在线| 精品无人区乱码1区2区3区在线| 精品亚洲一区二区三区四区五区| 国产精品永久免费在线| 欧美视频在线视频| 97久久超碰福利国产精品…| 日韩电影大片中文字幕| 亚洲国产小视频在线观看| 亚洲图片制服诱惑| 这里只有精品视频| 亚洲精品国产综合区久久久久久久| 日韩高清av一区二区三区| 午夜欧美大片免费观看| 国产精品白嫩初高中害羞小美女| 亚洲日韩欧美视频一区| 国外色69视频在线观看| 成人激情免费在线| 久久亚洲精品一区| 国产精品夫妻激情| 日韩av在线一区二区| 久久久久九九九九| 国产午夜一区二区| 中文字幕v亚洲ⅴv天堂| 中国日韩欧美久久久久久久久| 亚洲视频欧洲视频| 成人免费视频在线观看超级碰| 欧美日韩xxx| 日韩免费在线免费观看| 欧美亚洲另类激情另类| 亚洲女人天堂色在线7777| 国产亚洲欧美aaaa| 日本久久久久亚洲中字幕| 懂色av中文一区二区三区天美| 色综合久久天天综线观看| 色悠久久久久综合先锋影音下载| 日韩在线观看免费网站| 韩曰欧美视频免费观看| 九九热精品在线| 在线亚洲男人天堂| 国产精品∨欧美精品v日韩精品| 国产精品自拍小视频| 91香蕉国产在线观看| 久久久久久国产精品三级玉女聊斋| 久久黄色av网站| 97超碰蝌蚪网人人做人人爽| 性欧美xxxx视频在线观看| 欧美精品在线视频观看| 亚洲开心激情网| www.国产精品一二区| 国产精品天天狠天天看| 国产精品国产三级国产专播精品人| 欧美精品电影免费在线观看| 91在线视频一区| 成人精品网站在线观看| 午夜精品久久久久久久99黑人| 亚洲成人网在线观看| 欧美激情视频在线免费观看 欧美视频免费一| 欧美成人一二三| 欧美一级片在线播放| 精品亚洲男同gayvideo网站| 性欧美长视频免费观看不卡| 久久免费视频这里只有精品| 日韩欧美高清在线视频| 久久久久久久久国产| 午夜精品三级视频福利| 91性高湖久久久久久久久_久久99| 色青青草原桃花久久综合| 性欧美视频videos6一9| 久久久久久这里只有精品| 久久久久久久av| 国产91色在线播放| 日韩在线欧美在线国产在线| 久久久久久久999精品视频| 欧美性猛交xxxx富婆| 国产精品高潮呻吟久久av无限| 国产精品久久二区| 亚洲bt欧美bt日本bt| 欧美疯狂xxxx大交乱88av| 中文字幕在线观看日韩|