『隨筆』.Net 底層 數組[] 的 基本設計探祕 512 子數組

 1         static void Main(string[] args)
 2         {
 3             Console.ReadKey();    
 4 
 5             //初始化數組 不會立即開闢內存字節, 只有實際給數組賦值時 纔會開闢內存
 6             //
 7             //猜測數組內部的實現原理如下:
 8             //
 9             // > 數組內部 還有一個 數組集合
10             // > 賦值時, 會通過索引找到 對應的那個 數組集合的子數組, 然後初始化這個 子數組
11             // > 取值時, 如果索引對應的 子數組還沒有創建, 則直接返回 NULL
12             //
13             // > 經過下面代碼的 測算, 子數組的長度爲 512 左右
14             // > 比如: 你初始化一個 2048 個元素的數組, 數組內部其實開闢了 4個子數組
15             //
16             // > 下面的 array 和 array2, 
17             //    前者 i=i+1    肯定會 初始化每一個 子數組
18             //    後者 i=i+512  會跳躍定位 子數組
19             // > 最後 array 和 array2 佔用內存一樣多 —— 即: 跳躍 512 依然完成了全部子數組的初始化
20             
21 
22 
23             object[] array = new object[20 * 1024 * 1024];        //NULL 每個佔 8 字節    總內存 173M 
24             for (int i = 0; i < array.Length; i = i + 1)
25                 array[i] = null;
26 
27             object[] array2 = new object[20 * 1024 * 1024];        
28             for (int i = 0; i < array2.Length; i = i + 512)       //i=i+1   i=i+512   最後開闢的內存是一樣多的 (索引跳躍512 就會定位到 下一個子數組, 然後初始化這個 子數組)
29                 array2[i] = null;
30 
31 
32             //int[] array3 = new int[20 * 1024 * 1024];            //Int32 每個佔 4 字節
33             //for (int i = 0; i < array3.Length; i = i + 1)
34             //    array3[i] = 1;
35 
36 
37 
38             Console.ReadKey();
39 
40         }

 

測試代碼 比較簡單。

 

32位程序,啓動時 8M,

開闢 object[] 數組,全部賦值 NULL,內存飆到 173M  

object 在 數組中的指針 佔 8 字節

 

通過跳躍賦值, 得出結論:

數組內部 包含 若干個 子數組, 子數組 固定長度 512(左右)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章