List<T>
使用數組來存儲值/引用,所以我懷疑除了少量的開銷List<T>
增加的空間之外,將會有任何大小上的差異。
下面給出
var size = 1000000;
var numbers = new List<double>(size);
for (int i = 0; i < size; i++) {
numbers.Add(0d);
}
代碼堆看起來像這樣的相關對象
0:000> !dumpheap -type Generic.List
Address MT Size
01eb29a4 662ed948 24
total 1 objects
Statistics:
MT Count TotalSize Class Name
662ed948 1 24 System.Collections.Generic.List`1[[System.Double, mscorlib]]
Total 1 objects
0:000> !objsize 01eb29a4 <=== Get the size of List<Double>
sizeof(01eb29a4) = 8000036 ( 0x7a1224) bytes (System.Collections.Generic.List`1[[System.Double, mscorlib]])
0:000> !do 01eb29a4
Name: System.Collections.Generic.List`1[[System.Double, mscorlib]]
MethodTable: 662ed948
EEClass: 65ad84f8
Size: 24(0x18) bytes
(C:\Windows\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
Fields:
MT Field Offset Type VT Attr Value Name
65cd1d28 40009d8 4 System.Double[] 0 instance 02eb3250 _items <=== The array holding the data
65ccaaf0 40009d9 c System.Int32 1 instance 1000000 _size
65ccaaf0 40009da 10 System.Int32 1 instance 1000000 _version
65cc84c0 40009db 8 System.Object 0 instance 00000000 _syncRoot
65cd1d28 40009dc 0 System.Double[] 0 shared static _emptyArray
>> Domain:Value dynamic statics NYI
00505438:NotInit <<
0:000> !objsize 02eb3250 <=== Get the size of the array holding the data
sizeof(02eb3250) = 8000012 ( 0x7a120c) bytes (System.Double[])
所以List<double>
是8000036個字節,和底層陣列是8000012個字節。這很適合參考類型(Array
)通常的12字節開銷和雙倍1,000,000次8字節的開銷。最重要的是,List<T>
爲上面顯示的字段添加了另外24個字節的開銷。
結論:我沒有看到任何證據表明List<double>
將佔用較少的空間比double[]
爲相同數量的元素。
你的意思是「應用程序的大小約爲3或4 KB」。數組是動態分配的,所以結果exe文件無關緊要。而是看看任務管理器「內存使用」參數 – Dewfy