數組內存如何分配


第一個問題:

int [] test = new test[100];

我知道在堆中分配了100個單元的內存空間,但是在棧中存儲的是堆中的地址,問棧中分配了幾個單元的內存空間來存地址呢?
我自己查了下棧中好像是只保存了堆中100個單元的首地址,不大確定,求解?還有就是如果棧中只分配了一個單元存儲堆中首地址的話,那我們test[10]這樣查數組中的某個元素怎么定位的,是到堆中遍歷數組嗎?

第二個問題:

A [] test = new A[100];

A是一個類,網上是這么說的:會先在托管堆為test分配一次空間,並且這時不會自動初始化任何元素(即test[i]均為null)。等到以后有代碼初始化某個元素的時候(A[0]=new A();),這個引用類型元素的存儲空間才會被分配在托管堆上。
我想問的是"先在托管堆為test分配一次空間",這句話是什么意思,它分配了100個單位的內存空間嗎?但后面A[0] = new A();進行實例化時,它才分配了真正存儲數據的單元,但開始分配的100個單元的空間有什么用呢?

 

首先,如果你聲明的是值類型的數組,那么CLR分配內存時在堆中一次性分配足夠的內存空間,每個單元應該是所存儲類型的兩倍左右的容量,也就是200份int 類型的內存。該數據是已值方式存儲的。

如果是引用類型的話會創建100分的地址存儲引用空間,只是在沒初始化數組中具體值的時候都每個單元都存儲的是null引用,這個引用是4個字節長,當你對數組中某項初始化的時候,系統再次動態在堆中分配內存,並在這個數組項中存儲新分配內存的引用。

原則:

1、簡單的值類型的數組,每個數組成員是一個引用(指針),引用到棧上的空間(因為值類型變量的內存分配在棧上)

2、引用類型,類類型的數組,每個數組成員仍是一個引用(指針),引用到堆上的空間(因為類的實例的內存分配在堆上)

 

class Person{}

 

Person[] myPerson;

myPerson = new Person[2];

myPerson[0] = new Person;

myPerson[1] = new Person;

 

Persons是一個變量,它是一個可以容納兩個引用空間的內存塊,
因為數組在聲明定義的時候是能夠知道元素個數的,所以在堆棧
上分配的內存空間是預先可以知道的
(這里的堆棧簡化理解可以理解成為棧,在C++中由系統管理內存,
堆內存的管理是人工的C++中)
兩個引用實際上就是兩個指針變量,在32位機中,myPerson變量就是64字節(2*32)兩個指針變量的內存
空間,這64字節的內存空間名字命名為myPerson


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM