託管下的堆棧關係

 

首先,要先講講clr,clr向windows系統申請一塊空間,作爲託管堆,clr在託管堆上運行.net程序。在託管堆中,gc垃圾回收器負責對託管堆的管理(創建銷燬回收對象,整理託管堆,這方面內容下次講)。當創建一個對象的時候,即   class1 c = new class1();這個語句其實是需要分三步的。 1   new class1();  即調用class1的構造函數,初始化class1,這個動作在託管堆的表示爲:託管堆按照在棧上的類爲模版,在堆區創建一個類的對象,初始化其中的成員(調用構造函數,例如把值類型初始化爲0,把引用性設置爲null。。bool型我沒有試過,大家可以寫個測試程序試一試)   第二步,申明一個class1類型的變量,c,這個變量是生存在棧上的,併爲四個字節的大小(大小由操作系統決定,如果爲64位操作系統,則爲8個字節)。第三步,把剛纔在堆區上創建的對象的起始地址賦給c,即  c = new class1();最後就完成啦。

需要補充的一些東西是:所有的引用類型對象都是在堆區,而所有的值類型都是在棧區。方法體實際上是存活在棧區,但實例方法包含在對象中,對象裏存儲的是方法在棧區上的地址。堆是由clr管理,對象的生存週期由gc管理,而棧區的變量的存活時間是由其作用域決定的,出了作用域,變量生存期就到了。

發佈了47 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章