7.1堆和棧簡介
我們把內存分爲堆 空間和棧空間。
棧空間比較小,但是讀取速度快;堆空間比較大,但是讀取速度慢
棧的特徵,數據只能從棧的頂端插入和刪除;堆是一塊內存區域,與棧不同,堆裏的內存能夠以任意順序存入和移除。
CLR的GC(Garbage Collector垃圾回收器)就是內存管理機制。
7.2值類型和引用類型
類型被分爲兩種:值類型(整數,bool struct char 小數)和引用類型(string 數組 自定義的類,內置的類)。
值類型只需要一段單獨的內存,用於存儲實際的數據,(單獨定義的時候放在棧中)。
引用類型需要兩段內存,第一段存儲實際的數據,它總是位於堆中,第二段是一個引用,指向數據在堆中的存放位置。
當我們使用引用類型賦值的時候,其實是賦值的引用類型的引用(在棧內操作,賦值棧內存放的內存地址),並釋放沒有引用指向的堆空間。
Vector3 v1 = new Vector3();//定義的類
v1.x = 100;
v1.y = 100;
v1.z = 100;
Vector3 v2 = new Vector3();
v2.x = 200;
v2.y = 200;
v2.z = 200;
v2 = v1;
v2.x = 300;
Console.WriteLine(v1.x);//結果是300,因爲v2=v1賦值時,v1和v2的引用都指向同一個堆空間(原來v1指向的
//堆)
如果數組是一個值類型的數組,那麼數組中直接存儲值;如果是一個引用類型的數組(數組中存儲的是引用類型),那麼數組中存儲的是引用(內存地址)。
Vector3[] vArray = new Vector3[] { new Vector3(), new Vector3(), new Vector3() };
Vector3 v1 = vArray[0];
vArray[0].x = 100;
v1.x = 200;
Console.WriteLine(vArray[0].x);//修改v1.x vArray[].x結果也爲200