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