欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

關(guān)于C++為什么不加入垃圾回收機(jī)制解析-創(chuàng)新互聯(lián)

Java的愛好者們經(jīng)常批評(píng)C++中沒有提供與Java類似的垃圾回收(Gabage Collector)機(jī)制(這很正常,正如C++的愛好者有時(shí)也攻擊Java沒有這個(gè)沒有那個(gè),或者這個(gè)不行那個(gè)不夠好),導(dǎo)致C++中對(duì)動(dòng)態(tài)存儲(chǔ)的官吏稱為程序員的噩夢(mèng),不是嗎?你經(jīng)常聽到的是內(nèi)存遺失(memory leak)和非法指針存取,這一定令你很頭疼,而且你又不能拋棄指針帶來(lái)的靈活性。

專業(yè)領(lǐng)域包括網(wǎng)站制作、網(wǎng)站設(shè)計(jì)商城網(wǎng)站定制開發(fā)、微信營(yíng)銷、系統(tǒng)平臺(tái)開發(fā), 與其他網(wǎng)站設(shè)計(jì)及系統(tǒng)開發(fā)公司不同,創(chuàng)新互聯(lián)的整合解決方案結(jié)合了幫做網(wǎng)絡(luò)品牌建設(shè)經(jīng)驗(yàn)和互聯(lián)網(wǎng)整合營(yíng)銷的理念,并將策略和執(zhí)行緊密結(jié)合,為客戶提供全網(wǎng)互聯(lián)網(wǎng)整合方案。

在本文中,我并不想揭露Java提供的垃圾回收機(jī)制的天生缺陷,而是指出了C++中引入垃圾回收的可行性。請(qǐng)讀者注意,這里介紹的方法更多的是基于當(dāng)前標(biāo)準(zhǔn)和庫(kù)設(shè)計(jì)的角度,而不是要求修改語(yǔ)言定義或者擴(kuò)展編譯器。

什么是垃圾回收?

作為支持指針的編程語(yǔ)言,C++將動(dòng)態(tài)管理存儲(chǔ)器資源的便利性交給了程序員。在使用指針形式的對(duì)象時(shí)(請(qǐng)注意,由于引用在初始化后不能更改引用目標(biāo)的語(yǔ)言機(jī)制的限制,多態(tài)性應(yīng)用大多數(shù)情況下依賴于指針進(jìn)行),程序員必須自己完成存儲(chǔ)器的分配、使用和釋放,語(yǔ)言本身在此過(guò)程中不能提供任何幫助,也許除了按照你的要求正確的和操作系統(tǒng)親密合作,完成實(shí)際的存儲(chǔ)器管理。標(biāo)準(zhǔn)文本中,多次提到了“未定義(undefined)”,而這大多數(shù)情況下和指針相關(guān)。

某些語(yǔ)言提供了垃圾回收機(jī)制,也就是說(shuō)程序員僅負(fù)責(zé)分配存儲(chǔ)器和使用,而由語(yǔ)言本身負(fù)責(zé)釋放不再使用的存儲(chǔ)器,這樣程序員就從討厭的存儲(chǔ)器管理的工作中脫身了。然而C++并沒有提供類似的機(jī)制,C++的設(shè)計(jì)者Bjarne Stroustrup在我所知的唯一一本介紹語(yǔ)言設(shè)計(jì)的思想和哲學(xué)的著作《The Design and Evolution of C++》(中譯本:C++語(yǔ)言的設(shè)計(jì)和演化)中花了一個(gè)小節(jié)討論這個(gè)特性。簡(jiǎn)而言之,Bjarne本人認(rèn)為,

“我有意這樣設(shè)計(jì)C++,使它不依賴于自動(dòng)垃圾回收(通常就直接說(shuō)垃圾回收)。這是基于自己對(duì)垃圾回收系統(tǒng)的經(jīng)驗(yàn),我很害怕那種嚴(yán)重的空間和時(shí)間開銷,也害怕由于實(shí)現(xiàn)和移植垃圾回收系統(tǒng)而帶來(lái)的復(fù)雜性。還有,垃圾回收將使C++不適合做許多底層的工作,而這卻正是它的一個(gè)設(shè)計(jì)目標(biāo)。但我喜歡垃圾回收的思想,它是一種機(jī)制,能夠簡(jiǎn)化設(shè)計(jì)、排除掉許多產(chǎn)生錯(cuò)誤的根源。

需要垃圾回收的基本理由是很容易理解的:用戶的使用方便以及比用戶提供的存儲(chǔ)管理模式更可靠。而反對(duì)垃圾回收的理由也有很多,但都不是最根本的,而是關(guān)于實(shí)現(xiàn)和效率方面的。

已經(jīng)有充分多的論據(jù)可以反駁:每個(gè)應(yīng)用在有了垃圾回收之后會(huì)做的更好些。類似的,也有充分的論據(jù)可以反對(duì):沒有應(yīng)用可能因?yàn)橛辛死厥斩龅酶谩?/p>

并不是每個(gè)程序都需要永遠(yuǎn)無(wú)休止的運(yùn)行下去;并不是所有的代碼都是基礎(chǔ)性的庫(kù)代碼;對(duì)于許多應(yīng)用而言,出現(xiàn)一點(diǎn)存儲(chǔ)流失是可以接受的;許多應(yīng)用可以管理自己的存儲(chǔ),而不需要垃圾回收或者其他與之相關(guān)的技術(shù),如引用計(jì)數(shù)等。

我的結(jié)論是,從原則上和可行性上說(shuō),垃圾回收都是需要的。但是對(duì)今天的用戶以及普遍的使用和硬件而言,我們還無(wú)法承受將C++的語(yǔ)義和它的基本庫(kù)定義在垃圾回收系統(tǒng)之上的負(fù)擔(dān)。”

以我之見,統(tǒng)一的自動(dòng)垃圾回收系統(tǒng)無(wú)法適用于各種不同的應(yīng)用環(huán)境,而又不至于導(dǎo)致實(shí)現(xiàn)上的負(fù)擔(dān)。稍后我將設(shè)計(jì)一個(gè)針對(duì)特定類型的可選的垃圾回收器,可以很明顯地看到,或多或少總是存在一些效率上的開銷,如果強(qiáng)迫C++用戶必須接受這一點(diǎn),也許是不可取的。

關(guān)于為什么C++沒有垃圾回收以及可能的在C++中為此做出的努力,上面提到的著作是我所看過(guò)的對(duì)這個(gè)問(wèn)題敘述的最全面的,盡管只有短短的一個(gè)小節(jié)的內(nèi)容,但是已經(jīng)涵蓋了很多內(nèi)容,這正是Bjarne著作的一貫特點(diǎn),言簡(jiǎn)意賅而內(nèi)韻十足。

下面一步一步地向大家介紹我自己土制佳釀的垃圾回收系統(tǒng),可以按照需要自由選用,而不影響其他代碼。

構(gòu)造函數(shù)和析構(gòu)函數(shù)

C++中提供的構(gòu)造函數(shù)和析構(gòu)函數(shù)很好的解決了自動(dòng)釋放資源的需求。Bjarne有一句名言,“資源需求就是初始化(Resource Inquirment Is Initialization)”。

因此,我們可以將需要分配的資源在構(gòu)造函數(shù)中申請(qǐng)完成,而在析構(gòu)函數(shù)中釋放已經(jīng)分配的資源,只要對(duì)象的生存期結(jié)束,對(duì)象請(qǐng)求分配的資源即被自動(dòng)釋放。

那么就僅剩下一個(gè)問(wèn)題了,如果對(duì)象本身是在自由存儲(chǔ)區(qū)(Free Store,也就是所謂的“堆”)中動(dòng)態(tài)創(chuàng)建的,并由指針管理(相信你已經(jīng)知道為什么了),則還是必須通過(guò)編碼顯式的調(diào)用析構(gòu)函數(shù),當(dāng)然是借助指針的delete表達(dá)式。

智能指針

幸運(yùn)的是,出于某些原因,C++的標(biāo)準(zhǔn)庫(kù)中至少引入了一種類型的智能指針,雖然在使用上有局限性,但是它剛好可以解決我們的這個(gè)難題,這就是標(biāo)準(zhǔn)庫(kù)中唯一的一個(gè)智能指針::std::auto_ptr<>。

它將指針包裝成了類,并且重載了反引用(dereference)運(yùn)算符operator *和成員選擇運(yùn)算符operator ->,以模仿指針的行為。關(guān)于auto_ptr<>的具體細(xì)節(jié),參閱《The C++ Standard Library》(中譯本:C++標(biāo)準(zhǔn)庫(kù))。

例如以下代碼,

#include < cstring >
#include < memory >
#include < iostream >


class string
{
public:
  string(const char* cstr) { _data=new char [ strlen(cstr)+1 ]; strcpy(_data, cstr); }
  ~string() { delete [] _data; }
  const char* c_str() const { return _data; }
private:
  char* _data;
};


void foo()
{
  ::std::auto_ptr < string > str ( new string( " hello " ) );
  ::std::cout << str->c_str() << ::std::endl;
}

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.chinadenli.net,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

本文題目:關(guān)于C++為什么不加入垃圾回收機(jī)制解析-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)地址:http://www.chinadenli.net/article0/gseio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航品牌網(wǎng)站制作靜態(tài)網(wǎng)站用戶體驗(yàn)網(wǎng)站維護(hù)全網(wǎng)營(yíng)銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開發(fā)