裝箱與拆箱以及效能損失
阿新 • • 發佈:2018-12-30
先分析一下值型別與引用型別
值型別: Int32 i =4; 【變數i是值型別,被分配在棧上,變數包含變數例項,使用效率高】
引用型別: object o = i; 【變數o是引用型別,被分配在託管堆,變數包含例項的指標,通過此指標引用其例項】
引用型別效能要比值型別差很多,因此儘量使用值型別,而少使用引用型別。
裝箱
1 2 3 |
Int32
i =4; 定義一個值型別
objct
o = i; [裝箱]這個值型別被複制並分配到託管堆,並把它轉成引用型別O,這一個過程將會造成效能損失。
|
拆箱
1 2 3 4 5 |
Int32
i =4; 定義一個值型別
objct
o = i; 轉成引用型別O
Int32
n = (Int32)O;[拆箱]將託管堆中的引用型別例項複製到棧中,轉為值型別n
|
由此可見,裝箱和拆箱是要儘量避免的操作。
同時,儘可能少用Array,它的ADD操作會將值型別變數轉為引用型別,而泛型List則不會,它是一個增強版的Array,它可以直接新增值型別到List中。
1 2 3 4 5 |
Int32
i = 4; 定義值型別
Array
a = new Array();
定義一個集合
a.Add(i);
將值型別加入集合中,但是這一個過程會發生裝箱。 |