引用C++/CLI中的棧對(duì)象總結(jié)
C++/CLI是.NET平臺(tái)下的C++語(yǔ)言,當(dāng)然ISO C++的諸多語(yǔ)法保留下來(lái),棧對(duì)象便是其一,但是他的語(yǔ)義發(fā)生了變化,通過(guò)處理對(duì)象的作用返回就會(huì)自動(dòng)釋放其所占用的內(nèi)存。
大家都知道.NET平臺(tái)與win32平臺(tái)最大的差別是托管內(nèi)存,對(duì)C#了解的同志都知道,在C#里面分有值類型(value type)與引用類型(refrence type),值類型對(duì)象均分配在棧中,引用類型的都會(huì)分配在托管堆中。
換句話說(shuō)就是對(duì)象的類型決定了其分配的位置,棧還是托管堆。棧內(nèi)存的回收還是與以往一樣,是確定性的,托管堆內(nèi)存的回收是由垃圾回收器來(lái)負(fù)責(zé)。然而在這樣的內(nèi)存模型中,MyClass myClass;這個(gè)語(yǔ)句在C++/CLI中的語(yǔ)義會(huì)是什么呢?
眾所周知,高級(jí)語(yǔ)言得以出現(xiàn),主要?dú)w功于編譯器,語(yǔ)義會(huì)是怎么樣,當(dāng)然也取決于編譯器的編譯結(jié)果。下面通過(guò)一些簡(jiǎn)單的代碼進(jìn)行講解,請(qǐng)留意代碼中的注釋
- private:
- class SingleTonTranslator
- {
- public:
- SingleTonTranslator()
- {
- signal(SignalExceptionClass::GetSignalNumber(),
- SignalHandler);
- }
- static void SignalHandler(int)
- {
- throw SignalExceptionClass();
- }
- };
- public:
- SignalTranslator()
- {
- static SingleTonTranslator s_objTranslator;
- }
- };
- // An example for SIGSEGV
- class SegmentationFault : public ExceptionTracer, public
- exception
- {
- public:
- static int GetSignalNumber() {return SIGSEGV;}
- };
- SignalTranslator<SegmentationFault>
- g_objSegmentationFaultTranslator;
- // An example for SIGFPE
- class FloatingPointException : public ExceptionTracer, public
- exception
- {
- public:
- static int GetSignalNumber() {return SIGFPE;}
- };
但看了無(wú)數(shù)篇闡述C++復(fù)雜性的文章,和爭(zhēng)論C++復(fù)雜性的吐沫星子(包括我前段時(shí)間寫的兩篇關(guān)于C++的總結(jié))。我始終都有一個(gè)感覺(jué)——沒(méi)分析透,就跟盲人摸象一樣。正如“Why C++”的一位讀者批評(píng)的。
在文章里面沒(méi)有寫明到底哪些是C++的“非本質(zhì)復(fù)雜性”。當(dāng)然,我自己憑感覺(jué)就能知道,而接觸C++一段時(shí)間的人大致也能知道,但新手乃至非新手則對(duì)我所謂的“非本質(zhì)復(fù)雜性”根本沒(méi)有一個(gè)具體的認(rèn)識(shí),這就使得那篇“Why C++”脫離了原本的意圖——面向所有C++使用者和學(xué)習(xí)者。
同樣的原因,在寫了“你應(yīng)當(dāng)如何學(xué)習(xí)C++/CLI一文之后,當(dāng)孟巖先生邀請(qǐng)我給《程序員》寫一個(gè)系列的文章,介紹一下我在接觸C++的過(guò)程中的態(tài)度和認(rèn)識(shí)轉(zhuǎn)變時(shí),我雖然非常高興的答應(yīng)了。
但直到現(xiàn)在3個(gè)月過(guò)去了還是顆粒無(wú)收。為什么?因?yàn)槲矣X(jué)得真正本質(zhì)的問(wèn)題沒(méi)有被清晰的觸摸到;所以直到現(xiàn)在我都沒(méi)有動(dòng)筆,免得廢話說(shuō)了一大堆,除了能被當(dāng)成小說(shuō)讀讀之外,對(duì)真正考慮是否要學(xué)習(xí)乃至使用C++/CLI的人未必有什么實(shí)際用處。
【編輯推薦】