C++托管到底是什么
C++編程語言從發(fā)展至今已經(jīng)歷經(jīng)20年之久,我們在下面首先介紹了這一編程語言的基本概念以及構(gòu)成。在大家了解完這些內(nèi)容后,我們會進入近體那的主題,那就是為大家介紹什么事C++托管?#t#
C++這個詞在中國大陸的程序員圈子中通常被讀做“C加加”,而西方的程序員通常讀做“C plus plus”,“CPP”。 它是一種使用非常廣泛的計算機編程語言。C++是一種靜態(tài)數(shù)據(jù)類型檢查的,支持多重編程范式的通用程序設(shè)計語言。它支持過程化程序設(shè)計、數(shù)據(jù)抽象、面向?qū)ο蟪绦蛟O(shè)計、制作圖標(biāo)等等泛型程序設(shè)計等多種程序設(shè)計風(fēng)格。
根據(jù)Effective C++第三版第一條款的描述,現(xiàn)在C++由以下四個“子語言”組成:
1、C子語言。C++支持C語言的幾乎全部功能,在語法上與C語言僅有極微妙的差別(如括號表達式的左右值性,具體請參考C++標(biāo)準(zhǔn)文獻)。
2、面向?qū)ο蟮腃++。C++首先作為一門面向?qū)ο蟮恼Z言而聞名,這個特點在這里不再詳述。
3、泛型編程語言。C++強大(但容易失控的)模板功能使它能在編譯期完成許多工作,從而大大提高運行期效率。
4、STL(C++標(biāo)準(zhǔn)模板庫)。隨著STL的不斷發(fā)展,它已經(jīng)逐漸成為C++程序設(shè)計中不可或缺的部分,其效率可能比一般的naive代碼低些,但是其安全性與規(guī)范性使它大受歡迎。
在回答這個問題,首先要搞清楚什么是“托管”(Managed)。托管是.NET的一個專門概念,它是融于通用語言運行時(CLR)中的一種新的編程理念,因此我們完全可以把“托管”視為“.NET”。那么什么是“通用語言運行時”?通用語言運行時是.NET 框架應(yīng)用程序的執(zhí)行引摯。它提供了許多服務(wù),其中包括:代碼管理(裝入和執(zhí)行)、類型安全性驗證、元數(shù)據(jù)(高級類型信息)訪問、為管理對象管理內(nèi)存、管理代碼,COM對象和預(yù)生成的DLLs(非管理代碼和數(shù)據(jù))的交互操作性、對開發(fā)人員服務(wù)的支持等等。
也就是說,使用C++托管意味著,我們的代碼可以被CLR所管理,并能開發(fā)出具有最新特性如垃圾自動收集、程序間相互訪問等的.NET框架應(yīng)用程序。
由托管概念所引發(fā)的C++應(yīng)用程序包括托管代碼、托管數(shù)據(jù)和托管類三個組成部分。
(1) 托管代碼:.Net環(huán)境提供了許多核心的運行(RUNTIME)服務(wù),比如異常處理和安全策略。為了能使用這些服務(wù),必須要給運行環(huán)境提供一些信息代碼(元數(shù)據(jù)),這種代碼就是托管代碼。所有的C#、VB.NET、JScript.NET默認時都是托管的,但Visual C++默認時不是托管的,必須在編譯器中使用命令行選項(/CLR)才能產(chǎn)生托管代碼。
(2) 托管數(shù)據(jù):與托管代碼密切相關(guān)的是托管數(shù)據(jù)。托管數(shù)據(jù)是由公共語言運行的垃圾回收器進行分配和釋放的數(shù)據(jù)。默認情況下,C#、Visual Basic 和 JScript.NET 數(shù)據(jù)是托管數(shù)據(jù)。不過,通過使用特殊的關(guān)鍵字,C# 數(shù)據(jù)可以被標(biāo)記為非托管數(shù)據(jù)。Visual C++數(shù)據(jù)在默認情況下是非托管數(shù)據(jù),即使在使用 /CLR 開關(guān)時也不是托管的。
(3) 托管類:盡管Visual C++數(shù)據(jù)在默認情況下是非托管數(shù)據(jù),但是在使用C++托管擴展時,可以使用“__gc”關(guān)鍵字將類標(biāo)記為托管類。就像該名稱所顯示的那樣,它表示類實例的內(nèi)存由垃圾回收器管理。另外,一個托管類也完全可以成為 .NET 框架的成員,由此可以帶來的好處是,它可以與其他語言編寫的類正確地進行相互操作,如托管的C++類可以從Visual Basic類繼承等。但同時也有一些限制,如托管類只能從一個基類繼承等。需要說明的是,在C++托管應(yīng)用程序中既可使用托管類也可以使用非托管類。這里的非托管類不是指標(biāo)準(zhǔn)C++類,而是使用托管C++語言中的__nogc關(guān)鍵字的類。