C++與其他語(yǔ)言的比較_第1頁(yè)
C++與其他語(yǔ)言的比較_第2頁(yè)
C++與其他語(yǔ)言的比較_第3頁(yè)
C++與其他語(yǔ)言的比較_第4頁(yè)
C++與其他語(yǔ)言的比較_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、C+W其他語(yǔ)言的比較在 31 年前 (1979 年 ) ,一名剛獲得博士學(xué)位的研究員,為了開(kāi)發(fā)一個(gè)軟件項(xiàng)目發(fā)明了一門新編程語(yǔ)言,該研究員名為Bjarne Stroustrup ,該門語(yǔ)言則命名為一"C with classes ,四年后改稱為 C+。C+是一門通用編程語(yǔ)言,支持多種編程范式,包括過(guò)程式、面向?qū)ο螅╫bject-oriented programming, OP)、泛型 (genericprogramming, GP) ,后來(lái)為泛型而設(shè)計(jì)的模版,被發(fā)現(xiàn)及證明是圖靈完備的,因此使C+亦可支持模版元編程范式(template metaprogramming, TMP)。 C+

2、繼承了 C的特色,既為高級(jí)語(yǔ)言,又含低級(jí)語(yǔ)言功能,可同時(shí)作為系統(tǒng)和應(yīng)用編程語(yǔ)言。C+廣泛應(yīng)用在不同領(lǐng)域,使用者以數(shù)百萬(wàn)計(jì)。根據(jù)近十年的調(diào)查,C+的流行程度約穩(wěn)定排行第 3 位 ( 于 C/Java 之后 ) 。 C+ 經(jīng)歷長(zhǎng)期的實(shí)踐和演化,才成為今日的樣貌。1998 年,C+標(biāo)準(zhǔn)委員會(huì)排除萬(wàn)難,使 C+成為ISO標(biāo)準(zhǔn)(俗稱C+98),當(dāng)中含非常強(qiáng)大的標(biāo)準(zhǔn)模版庫(kù) (standard template library, STL)。之后委員會(huì)在2005 年提交了有關(guān)標(biāo)準(zhǔn)庫(kù)的第一個(gè)技術(shù)報(bào)告( 簡(jiǎn)稱 TR1) ,并為下一個(gè)標(biāo)準(zhǔn)C+0x 而努力??上+0x 并不能在200x年完成,各界希望新標(biāo)準(zhǔn)能于20

3、11 年內(nèi)出臺(tái)。流行的C+編譯器中,微軟 Visual C+ 2010 已實(shí)現(xiàn)部分 C+0x語(yǔ)法并加入TR1擴(kuò)充庫(kù),而 gcc 對(duì) C+0x 語(yǔ)法和庫(kù)的支持比VC2010 更多。2ZcaY。應(yīng)否選擇C+哪些程序適宜使用C+?C+并非萬(wàn)能丹,我按經(jīng)驗(yàn)舉出一些C+的適用時(shí)機(jī)。C+適合構(gòu)造程序中需求較穩(wěn)定的部分,需求變化較大的部分可使用腳本語(yǔ)言;程序須盡量發(fā)揮硬件的最高性能,且性能瓶頸在于CPU 和內(nèi)存;程序須頻繁地與操作系統(tǒng)或硬件溝通;程序必須使用C+ 框架 / 庫(kù),如大部分游戲引擎( 如 Unreal/Source) 及中間件( 如Havok/FMOD),雖然有些C+庫(kù)提供其他語(yǔ)言的綁定,但通常

4、原生的API性能最好、最新;s6GQb。項(xiàng)目中某個(gè)目標(biāo)平臺(tái)只提供C+編譯器的支持。按應(yīng)用領(lǐng)域來(lái)說(shuō),C+適用于開(kāi)發(fā)服務(wù)器軟件、桌面應(yīng)用、游戲、實(shí)時(shí)系統(tǒng)、高性能計(jì)算、嵌入式系統(tǒng)等。使用C+還是C?C+和C的設(shè)計(jì)哲學(xué)并不一樣,兩者取舍不同,所以不同的程序員和軟件項(xiàng)目會(huì)有不同選擇,難以一概而論。與 C+相比,C具備編譯速度快、容易學(xué)習(xí)、顯式描述程序細(xì)節(jié)、較少更新標(biāo)準(zhǔn)(后兩者也可同時(shí)視為缺點(diǎn))等優(yōu)點(diǎn)。在語(yǔ)言層面上,C+包含絕大部分 C語(yǔ)言的功能(例外之一,C+沒(méi)有C99的變長(zhǎng)數(shù)組 VLA),且提供OOP和GP的特性。但其實(shí)用 C也可實(shí)現(xiàn)OOP 思想,亦可利用宏去實(shí)現(xiàn)某程度的GP,只不過(guò)C+的語(yǔ)法能較簡(jiǎn)潔

5、、自動(dòng)地實(shí)現(xiàn)OOP/GP。C+的 RAII(resource acquisition is initialization,資源獲取就是初始化 )特性比較獨(dú)特,C/C#/Java沒(méi)有相應(yīng)功能?;仡櫄v史,Stroustrup開(kāi)發(fā)的早期C+編譯器Cpre/Cfront 是把 C+源代碼 QRLdp翻譯為C,再用C編譯器編譯的。由此可知,C+編寫(xiě)的程序,都能用等效的C程序代替,但 C+在語(yǔ)言層面上提供了 OOP/GP語(yǔ)法、更嚴(yán)格的類型檢查系 統(tǒng)、大量額外的語(yǔ)言特性(如異常、RTTI等),并且C+標(biāo)準(zhǔn)庫(kù)也較豐富。有時(shí)候 C+的語(yǔ)法 可使程序更簡(jiǎn)潔,如運(yùn)算符重載、隱式轉(zhuǎn)換。但另一方面, C語(yǔ)言的API通常

6、比C+簡(jiǎn)潔, 能較容易供其他語(yǔ)言程序調(diào)用。因此,一些 C+庫(kù)會(huì)提供C的API封裝,同時(shí)也可供 C程序 調(diào)用。相反,有時(shí)候也會(huì)把C的API封裝成C+形式,以支持 RAII和其他C+庫(kù)整合等。cWXw z為何C+性能可優(yōu)于其他語(yǔ)言?相對(duì)運(yùn)行于虛擬機(jī)語(yǔ)言( 如 C#/Java) , C/C+ 直接以靜態(tài)形式把源程序編譯為目標(biāo)平臺(tái)的機(jī)器碼。一般而言,C/C+ 程序在編譯及鏈接時(shí)可進(jìn)行的優(yōu)化最豐富,啟動(dòng)時(shí)的速度最快,運(yùn)行時(shí)的額外內(nèi)存開(kāi)銷最少。而C/C+ 相對(duì)動(dòng)態(tài)語(yǔ)言( 如 Python/Lua) 也減少了運(yùn)行時(shí)的動(dòng)態(tài)類型檢測(cè)。此外,C/C+ 的運(yùn)行行為是確定的,且不會(huì)有額外行為( 例如 C#/Java

7、必然會(huì)初始化變量 ) ,也不會(huì)有如垃圾收集(GC) 而造成的不確定性延遲,而且C/C+ 的數(shù)據(jù)結(jié)構(gòu)在內(nèi)存中的布局也是確定的。有時(shí)C+的一些功能會(huì)使程序性能優(yōu)于C,當(dāng)中以內(nèi)聯(lián)和模版最為突出,這兩項(xiàng)功能使 C+標(biāo)準(zhǔn)庫(kù)的sort()通常比C標(biāo)準(zhǔn)庫(kù)的qsort() 快多倍(C可用宏或人手編碼去解決此問(wèn)題) 。另一方面,C/C+ 能直接映射機(jī)器碼,之間沒(méi)有另一層中間語(yǔ)言,因此可以做底層優(yōu)化,例如使用內(nèi)部(intrinsic)函數(shù)和嵌入?yún)R編語(yǔ)言。然而,許多 C+的性能優(yōu)點(diǎn)并非免費(fèi)午餐,代價(jià)包括較長(zhǎng)的編譯鏈接時(shí)間和較易出錯(cuò),因而增加開(kāi)發(fā)時(shí)間和成本,這點(diǎn)稍后補(bǔ)充。nMiYs。我進(jìn)行了一個(gè)簡(jiǎn)單全局渲染性能測(cè)試(

8、512x512 像素,每像素10000 個(gè)采樣 ) , C+ 1 小時(shí)36 分、 Java 3 小時(shí) 18 分、 Python 約 18 天、 Ruby 約 351 天。CZRj3。C+常見(jiàn)問(wèn)題C+源代碼跨平臺(tái)嗎?C+有不錯(cuò)的跨平臺(tái)能力,但由于直接映射硬件,因性能優(yōu)化的關(guān)系,跨平臺(tái)能力不及Java及多數(shù)腳本語(yǔ)言。然而,實(shí)踐跨平臺(tái)的C+ 軟件還是可行的,但須注意以下問(wèn)題:0TbF0。C+標(biāo)準(zhǔn)沒(méi)有規(guī)定原始數(shù)據(jù)類型(如int)的大小,需要特定大小的類型時(shí),可自訂類型(如int32_t) ,同時(shí)對(duì)任何類型使用sizeof() 而不假設(shè)其大?。籯8ZJu。字節(jié)序 (byte order) 按 CPU 有

9、所不同,特別要注意二進(jìn)制輸入輸出、reinterpret_cast法;1bvPQ。原始數(shù)據(jù)和結(jié)構(gòu)類型的地址對(duì)齊有差異;編譯器提供的一些編譯器或平臺(tái)專用擴(kuò)充指令;避免作應(yīng)用二進(jìn)制接口(application binary interface, ABI)的假設(shè),例如調(diào)用函數(shù)時(shí)參數(shù)的取值順序在C/C+中沒(méi)定義,在 C+中也不可隨便假設(shè)RTTI/虛表等實(shí)現(xiàn)方式。r2IYC??偫ǘ?,跨平臺(tái)C+軟件可在頭文件中用宏檢測(cè)編譯器和平臺(tái),再用宏、 typedef 、自定平臺(tái)相關(guān)實(shí)現(xiàn)等方法去實(shí)踐跨平臺(tái),C+ 標(biāo)準(zhǔn)不會(huì)提供這類幫助。C+程序容易崩潰?和許多語(yǔ)言相比,C/C+ 提供不安全的功能以最優(yōu)化性能,有可能造

10、成崩潰。但要注意,很多運(yùn)行時(shí)錯(cuò)誤,如向空指針/ 引用解引用、數(shù)組越界、堆棧溢出等,其他語(yǔ)言也會(huì)報(bào)錯(cuò)或拋出異( 例如程序繼續(xù)把內(nèi)存Chrome 或使用 代替 C 字符串;以 ) ;使用智能指針也常,這些都是程序問(wèn)題,而不是語(yǔ)言本身的問(wèn)題。有些意見(jiàn)認(rèn)為,出現(xiàn)這類運(yùn)行時(shí)錯(cuò)誤,應(yīng)該 盡量寫(xiě)入日志并立即崩潰,不該讓程序繼續(xù)運(yùn)行,以免造成更大的影響中錯(cuò)誤的數(shù)據(jù)覆寫(xiě)文件) 。若要容錯(cuò),可按業(yè)務(wù)把程序分割為多進(jìn)程,像fork() 的形式。然而,C+ 有許多機(jī)制可以減少錯(cuò)誤,例如以stringvector 或 array(TR1) 代替原始數(shù)組( 有些實(shí)現(xiàn)可在調(diào)試模式檢測(cè)越界能減少一些原始指針的問(wèn)題。另外,我最

11、常遇到的Bug ,就是沒(méi)有初始化成員變量,有時(shí)會(huì)導(dǎo)致崩潰,而且調(diào)試版和發(fā)行版的行為可能不同。fdLZHC+要手動(dòng)做內(nèi)存管理?C+同時(shí)提供在堆棧上的自動(dòng)局部變量,以及從自由存儲(chǔ)(free store)分配的對(duì)象。對(duì)于后者,程序員需手動(dòng)釋放,或使用不同的容器和智能指針。C+ 程序員經(jīng)常進(jìn)一步優(yōu)化內(nèi)存,自定義內(nèi)存分配策略以提升效能,例如使用對(duì)象池、自定義的單向/ 雙向堆棧區(qū)等。雖然C+0x還沒(méi)加入GC功能,但也可以自行編寫(xiě)或使用現(xiàn)成庫(kù)。此外, C/C+也可以直接使用操作系統(tǒng)提供的內(nèi)存相關(guān)功能,例如內(nèi)存映射文件、共享內(nèi)存等。4Vl37。使用C+常要重造輪子?我曾參與的C+ 項(xiàng)目,都會(huì)重造不少標(biāo)準(zhǔn)庫(kù)已提

12、供的功能,此情況在其他語(yǔ)言中較少出現(xiàn)。我試圖分析個(gè)中原因。首先,C+標(biāo)準(zhǔn)庫(kù)相對(duì)很多語(yǔ)言來(lái)說(shuō)是貧乏的,各開(kāi)發(fā)者便會(huì)重復(fù)地制造自訂庫(kù)。從另一個(gè)角度看,C+標(biāo)準(zhǔn)庫(kù)是用C+編寫(xiě)的(很多其他語(yǔ)言不用自身而是用C/C+去編寫(xiě)庫(kù)) ,在能力和性能上,自訂庫(kù)和標(biāo)準(zhǔn)庫(kù)并無(wú)本質(zhì)差別;另外,標(biāo)準(zhǔn)庫(kù)為通用而設(shè),對(duì)不同平臺(tái)及多種使用需求作取舍,性能上有所影響,例如EA 公司就曾發(fā)表自制的EASTL 規(guī)格,描述游戲開(kāi)發(fā)方面對(duì)STL的性能及功能需求的特點(diǎn);此外,多個(gè)C+庫(kù)一起使用,經(jīng)常會(huì)因規(guī)范不同而引起沖突,又或功能重疊,所以項(xiàng)目可能須自行開(kāi)發(fā),或引入其他庫(kù)的概念或?qū)崿F(xiàn) ( 如 Boost/TR1/Loki) ,改寫(xiě)以符合

13、項(xiàng)目規(guī)范。r2wxM。C+編譯速度很慢?錯(cuò),是非常慢。我認(rèn)為C+可能是實(shí)用程序語(yǔ)言中編譯速度最慢的。此問(wèn)題涉及C+沿用C的編譯鏈接方式,又加入了復(fù)雜的類/ 泛型聲明和內(nèi)聯(lián)機(jī)制,使編譯時(shí)間倍增。在C+ 對(duì)編譯方法改革之前( 如 module 提案 ) ,可使用以下技巧改善:第一,使用pimpl 手 D3tLC。法,因性能損耗應(yīng)用于調(diào)用次數(shù)不多的類;第二,僅包含必要頭文件,并盡量使用及提供前置聲明版本的頭文件( 如 iosfwd) ;第三采用基于接口的設(shè)計(jì),但須注意虛函數(shù)調(diào)用成本;第四,采用unity build ,即把多個(gè)cpp 文件結(jié)合在一個(gè)編譯單元進(jìn)行編譯;第五,采用分布式生成系統(tǒng)如Incr

14、ediBuild 。 nH3zR。C+缺乏什么功能?雖然C+已經(jīng)非常復(fù)雜,但仍缺少很多常見(jiàn)功能。C+0X作出了不少改善,例如語(yǔ)言方面加入 Lambda 函數(shù)、閉包、類型推導(dǎo)聲明等,而庫(kù)方面則加入正則表達(dá)式、采用哈希表的unordered_set/unordered_map、引用計(jì)數(shù)智能指針shared_ptr/weak_ptr 等。但最值得留點(diǎn)的是 C+0X一弓I入多線程的語(yǔ)法和庫(kù)功能,這是C+武進(jìn)的一大樂(lè)。然而,模組、GC、反射機(jī)制等功能雖有提案,卻未加進(jìn) C+0X。VHIYuC+使用建議為應(yīng)用挑選特性集我同意Stroustrup關(guān)于使用C+各種技術(shù)的回應(yīng):彳爾可以做,不意味著你必須這么做。

15、(Just because you can do it, doesn't mean that you have to.)”C+充滿豐富的特性,但同時(shí)帶來(lái)不同問(wèn)題,例如過(guò)分復(fù)雜、編譯及運(yùn)行性能的損耗。一般可考慮是否使用多重繼承、異常、RTTI ,并調(diào)節(jié)使用模版及模版元編程的程度。使用過(guò)分復(fù)雜的設(shè)計(jì)和功能,可能會(huì)令部分團(tuán)隊(duì)成員更難理解和維護(hù)。wkAKn。為團(tuán)隊(duì)建立編程規(guī)范C+的編碼自由度很高,容易編寫(xiě)風(fēng)格迥異的代碼,C+本身也沒(méi)有定義一些標(biāo)準(zhǔn)規(guī)范。而且,C+的源文件物理構(gòu)成,較許多語(yǔ)言復(fù)雜。因此,除了決定特性集,每個(gè)團(tuán)隊(duì)?wèi)?yīng)建立一套 編程規(guī)范,包括源文件格式( 可使用文件模版) 、花

16、括號(hào)風(fēng)格。gsLec。盡量使用C+ 風(fēng)格而非C 風(fēng)格由于C+有對(duì)C兼容的包袱,一些功能可以使用C風(fēng)格實(shí)現(xiàn),但最好使用C+提供的新功能。最基本的是盡量以具名常量、內(nèi)聯(lián)函數(shù)和泛型取代宏,只把宏用在條件式編譯及特殊情況。舊式的C要求局部變量聲明在作用域開(kāi)端,C+則無(wú)此限制,應(yīng)把變量聲明盡量置于鄰近其使用的地方,for() 的循環(huán)變量聲明可置于for 的括號(hào)內(nèi)。C+ 中能加強(qiáng)類型安全的功能應(yīng)盡量使用,例如避免“ 萬(wàn)能 ” 指針 void * ,而使用個(gè)別或泛型類型;用bool 而非 int 表示布爾值;選用4 種 C+ cast 關(guān)鍵字代替簡(jiǎn)單的強(qiáng)制轉(zhuǎn)換。RRdkH。結(jié)合其他語(yǔ)言如前文所述,C+并非適

17、合所有應(yīng)用情境,有時(shí)可以混合其他語(yǔ)言使用,包括用C+擴(kuò)展其他語(yǔ)言,或在C+ 程序中嵌入腳本語(yǔ)言引擎。對(duì)于后者,除了使用各種腳本語(yǔ)言的專門API ,還可使用 Boost 或 SWIG 作整合。2ee8j。C+學(xué)習(xí)建議C+缺點(diǎn)之一,是相對(duì)許多語(yǔ)言復(fù)雜,而且難學(xué)難精。許多人說(shuō)學(xué)習(xí) C語(yǔ)言只需一本K&RC程序設(shè)計(jì)語(yǔ)言即可,但C+書(shū)籍卻是多不 Y11t9 0勝數(shù)。我是從 C進(jìn)入C+,皆是靠閱讀自學(xué)。在此分享一點(diǎn)學(xué)習(xí)心得。個(gè)人認(rèn)為,學(xué)習(xí) C+可分為4個(gè)層次:第一層次,C+基礎(chǔ):挑選一本入門書(shū)籍,如C+ Primer、C+大學(xué)教程、或Stroustrup 撰寫(xiě)的經(jīng)典C+程序設(shè)計(jì)語(yǔ)言或他一年半前的新作C+程序設(shè)計(jì)原理與實(shí)踐,而一般C+ 課程也止于此,另外C+ 標(biāo)準(zhǔn)程序庫(kù)及The C+ StandardLibrary Extensions 可供參考;bFYmc第二層次,正確高效地使用C+:此層次開(kāi)始必須自修,閱讀過(guò) (More)EffectiveC+、 (More)Exceptiona1 C+、 Effective STL 及C+ 編程規(guī)范等,才適宜踏入專業(yè)C+ 開(kāi)發(fā)之路;8Gk8d。第三層次,深入了解 C+:關(guān)于全局問(wèn)題

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論