C#new出来的结构体内存分配在堆上
生活随笔
收集整理的這篇文章主要介紹了
C#new出来的结构体内存分配在堆上
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
C#new出來的結(jié)構(gòu)體內(nèi)存分配在堆上
如題,有同事說因?yàn)榻Y(jié)構(gòu)體是值類型,所以 new出來的也是分配在棧上的。我的直覺是但凡使用new的東西都在堆上分配內(nèi)存,除非C#對(duì)結(jié)構(gòu)體做了特殊處理。
new int[10]這個(gè)說明不了什么,因?yàn)閿?shù)組是引用類型,必然在堆上分配。
如何驗(yàn)證?
利用UNITY的profiler來觀察內(nèi)存變化 :new?一個(gè)內(nèi)存占用很大的結(jié)構(gòu)體,比如80M,看GC ALLOC?突現(xiàn)了80M,說明確實(shí)是在堆上分配的。然后GC掉,多次重復(fù)現(xiàn)象相同。
?
static void funcformemheaporstack(){//1, C#中的引用相當(dāng)于C++中的智能指針,而不是原始指針, 原始指針無法進(jìn)行引用計(jì)數(shù),因而無法進(jìn)行自動(dòng)的內(nèi)存回收ST001 ot = new ST001(); //ot相當(dāng)于一個(gè)ST001類型的智能指針(對(duì)象),出函數(shù)后,對(duì)象被銷毀,對(duì)堆的引用計(jì)數(shù)減1ot.x = 10;ST001 ot2 = ot; //值拷貝,而不是地址拷貝ot2.x = 20;Console.Write(ot.x); //10//2,結(jié)構(gòu)體類型對(duì)象可分配在堆上,也可分配在棧上ST001 ot3; //棧上(class不能這樣用)ot3.x = 10; ot3.y = 20; ot3.z = 30;STWrap ow;//ow.x = 10; //error,ow沒有初始化STWrap ow2 = new STWrap();ow2.ot.x = 10; //ot分配在堆上,因?yàn)閛w2在堆上 }或者,直接看IL代碼
或者,看匯編代碼
posted on 2018-09-11 22:46 時(shí)空觀察者9號(hào) 閱讀(...) 評(píng)論(...) 編輯 收藏
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的C#new出来的结构体内存分配在堆上的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#new出来的结构体内存分配
- 下一篇: 安装安卓SDK和JDK的简便方法