對(duì)Visual C++ 2005編譯器進(jìn)行學(xué)習(xí)研究
微軟Visual C++開(kāi)發(fā)小組在廣泛聽(tīng)取意見(jiàn)的基礎(chǔ)上,重新改進(jìn)了c,在Visual Studio .NET 2002中那種“笨拙”的C++托管擴(kuò)展語(yǔ)法已經(jīng)一去不復(fù)返了,而修訂后的語(yǔ)言定義帶來(lái)的是一個(gè)完全充滿吸引力的新語(yǔ)法。
和一體化的語(yǔ)言支持特性,如部分模板專用化;同時(shí)也包括了增強(qiáng)的緩沖區(qū)安全檢查和改進(jìn)的編譯器診斷功能。以往使用C#和Visual Basic® .NET的開(kāi)發(fā)者,通過(guò)簡(jiǎn)單的拖放操作,就能生成穩(wěn)健的Windows窗體應(yīng)用程序,如今,C++的開(kāi)發(fā)者也加入了進(jìn)來(lái)。
而且,這個(gè)編譯器還對(duì)Intel Pentium 4和AMD Athlon處理器作了優(yōu)化處理。如果Visual C++ .NET 2003都令你興奮不已,那么它的***版本Visual C++ 2005,足夠令你高興得發(fā)狂了。對(duì)于 .NET開(kāi)發(fā),Visual C++ 2005如今有了一套新的語(yǔ)法,不但顯得更“優(yōu)雅”,而且更強(qiáng)大;
它擁有新的優(yōu)化技術(shù),可使程序的速度***提高30%;同時(shí)新的編譯模式,可保證在Microsoft® .NET Framework之上生成完全遵從CLI(Common Language Infrastructure)的可驗(yàn)證代碼;而且新的interop模式,可提供本地與托管代碼的無(wú)縫融合。#t#
相對(duì)于前兩個(gè)版本,新編譯器還包括了一個(gè)增強(qiáng)版本的緩沖區(qū)安全檢查選項(xiàng),而且對(duì)C++程序普遍使用的庫(kù),也有新的注重安全的版本。Visual C++ 2005對(duì)基于Intel Itanium和AMD64的64位平臺(tái),提供了對(duì)OpenMP標(biāo)準(zhǔn)的支持,并且修正了一些混合DLL加載的問(wèn)題,對(duì)Double P/Invoke(雙轉(zhuǎn)換)的性能問(wèn)題,提供了自動(dòng)運(yùn)行時(shí)消除。關(guān)于類似的增強(qiáng)和改進(jìn)還有很多很多,正如一位C++架構(gòu)師說(shuō)的那樣,“如今,C++終于站在了它應(yīng)該站的位置上”。
可能我們中有不少人都發(fā)現(xiàn),要在前兩個(gè)版本的C++中使用托管擴(kuò)展語(yǔ)法,會(huì)非常麻煩并且錯(cuò)誤重重,也許還會(huì)覺(jué)得,Visual C++并非是 .NET開(kāi)發(fā)的***語(yǔ)言。
微軟Visual C++開(kāi)發(fā)小組在廣泛聽(tīng)取意見(jiàn)的基礎(chǔ)上,重新改進(jìn)了c,在Visual Studio .NET 2002中那種“笨拙”的C++托管擴(kuò)展語(yǔ)法已經(jīng)一去不復(fù)返了,而修訂后的語(yǔ)言定義帶來(lái)的是一個(gè)完全充滿吸引力的新語(yǔ)法。在語(yǔ)言設(shè)計(jì)上,微軟Visual C++開(kāi)發(fā)小組制定了一些主要的目標(biāo)。
首先(對(duì)那些認(rèn)為編程是藝術(shù)的人來(lái)說(shuō),也許是最重要的),他們要保證在開(kāi)發(fā)者在編寫C++代碼時(shí)感覺(jué)自然,為達(dá)到這個(gè)目的,他們對(duì)ISO C++標(biāo)準(zhǔn)作了一個(gè)在語(yǔ)法上優(yōu)雅的純粹擴(kuò)展,目的是為了在像單擊部署、窗體設(shè)計(jì)支持和SQL Server™ 2005的托管代碼支持這些地方。
可更簡(jiǎn)單地用C++編寫可驗(yàn)證的代碼。他們想要設(shè)計(jì)出一個(gè)超過(guò)C++的語(yǔ)言,要帶給C++全部的 .NET能力,同時(shí)也要帶給 .NET全部的C++能力。現(xiàn)在看來(lái),他們非常的成功。
新的擴(kuò)展規(guī)范被稱為“Visual C++ 2005”,并且正在被標(biāo)準(zhǔn)化。在閱讀代碼時(shí),最引人注意之處就是,以往那種在托管擴(kuò)展中定義垃圾回收類、屬性等等常用到的雙下劃線關(guān)鍵字,現(xiàn)在已成為了歷史。雖然也有一些類似的關(guān)鍵字被保留,但由于不會(huì)被經(jīng)常用到,所以不會(huì)對(duì)代碼的可讀性造成影響。這些雙下劃線關(guān)鍵字如今被兩種新的“關(guān)鍵字”取代:“上下文敏感”和“空格”。“上下文敏感”關(guān)鍵字是只在特定的上下文中,才是關(guān)鍵字;
而“空格”關(guān)鍵字只在聯(lián)合其他關(guān)鍵字時(shí),才會(huì)是關(guān)鍵字。例如:在托管擴(kuò)展中的關(guān)鍵字__property已被關(guān)鍵字property取代(不只是這樣,定義和訪問(wèn)屬性的整個(gè)語(yǔ)法都被精煉了,它的聲明與C#看起來(lái)很相似,參見(jiàn)插1),而且在你的代碼中,還可以使用property作為變量名,只有在一個(gè)類型中聲明屬性時(shí),“property”才會(huì)被當(dāng)作一個(gè)關(guān)鍵字。
現(xiàn)在,Visual C++ 2005對(duì)任何類型的托管和本地對(duì)象,都提供了一個(gè)析構(gòu)函數(shù)或結(jié)束器(finalizer)。當(dāng)類型是托管時(shí),編譯器映射一個(gè)析構(gòu)函數(shù)到IDisposable::Dispose方法中。
這意味著,你可用C++來(lái)編寫同樣的方法——如插3中的第四段代碼,而且reader的析構(gòu)或清除方法會(huì)被自動(dòng)調(diào)用,就好像在C#中使用“using”一樣。這樣,當(dāng)創(chuàng)建在堆棧上的類型超出作用范圍之后,它的析構(gòu)函數(shù)就會(huì)被調(diào)用。
托管擴(kuò)展帶來(lái)的***問(wèn)題就是指針問(wèn)題了。
雖然指針很難理解,但卻是應(yīng)付多種任務(wù)和多種情況的“多面手”。在Visual C++ 2005中,指針仍舊是老式的C++指針,它指向一個(gè)對(duì)象,并能執(zhí)行一些算法。引用一個(gè)對(duì)象的指針,它的生存期必須由開(kāi)發(fā)者顯示地管理,當(dāng)與指針打交道時(shí),運(yùn)行時(shí)庫(kù)可不負(fù)責(zé)清理它。
現(xiàn)在,來(lái)看一下Visual C++ 2005的設(shè)計(jì)者是怎樣實(shí)現(xiàn)的吧,Visual Studio .NET 2003和Visual Studio .NET 2005中的new操作符通常返回一個(gè)指針,而gcnew操作符返回一個(gè)“句柄”,一個(gè)用脫字符 ^ 語(yǔ)法表示的一個(gè)結(jié)構(gòu),此句柄指向托管堆的對(duì)象。
因此,它們不能指向interior類型,而且在用法上,編譯器也作了不少限制,以便開(kāi)發(fā)者正確、安全地使用它們。句柄不能執(zhí)行指針?biāo)惴?,也不能轉(zhuǎn)換成一個(gè)空指針或任何其他整數(shù)類型,話說(shuō)回來(lái),依然可使用星號(hào)(*)和箭號(hào)(->)操作符。
這不是說(shuō),你再不能取得一個(gè)指向垃圾回收堆中的指針了,在Visual C++ 2005中的pin_ptr,可用于取得托管堆中對(duì)象的一個(gè)固定指針,只要這個(gè)指針存在,對(duì)象就被固定在托管堆中,以防止垃圾回收器清除它;Visual C++ 2005同時(shí)也引入了“引用跟蹤”操作符,以百分號(hào) % 表示。
當(dāng)年在Visual C++ 2005中引入 & 引用操作符時(shí),大多數(shù)開(kāi)發(fā)者把它理解成一個(gè)指向?qū)ο蟮闹羔?,而且由編譯器自動(dòng)解引用。在很多方面來(lái)說(shuō),% 之于 ^,就像 & 之于 *。
在托管世界中,對(duì)托管對(duì)象的本地引用,與指向托管對(duì)象的本地指針一樣危險(xiǎn),指針和引用的基本原理在于,被引用的對(duì)象不能四處移動(dòng)。引用跟蹤與本地引用非常類似。
除了它引用的對(duì)象是在托管堆中,而且被垃圾回收器移動(dòng)之后,還能繼續(xù)跟蹤它們。百分號(hào) % 操作符用來(lái)取托管對(duì)象的地址,就像 & 操作符對(duì)于本地對(duì)象的功能一樣,百分號(hào) % 操作符可返回一個(gè)托管引用類型對(duì)象的句柄。



















