这是一个简单的问题,但我想了解内存中会发生什么.
我知道将值类型转换为引用类型是装箱.
int I = 10;
object obj = I; // boxing - I is moved from stack to heap
Run Code Online (Sandbox Code Playgroud)
1. int数组的内容:
int[] arrInt = new int[1];
arrInt[0] = 10;
int I = arrInt[0];
Run Code Online (Sandbox Code Playgroud)
在这里,我知道arrInt在堆栈中(带有地址到堆)并且指向堆存储'10'的堆.
在这种情况下,10'盒装'并存储在堆中?或者它作为未装箱的值类型存在?所以,当我重新访问该项目时,int I = arrInt[0]会发生什么?
2. int通用列表的内容:
List<int> lstInt = new List<int>(){10};
int I = lstInt[0];
Run Code Online (Sandbox Code Playgroud)
在通用的情况下List<int>,在msdn文档中,它引用using generic collections avoids the overhead of boxing:" http://msdn.microsoft.com/en-us/library/vstudio/ms172194(v=vs.100).aspx "但我不明白,如果在泛型中List的情况下整数值是如何存储的?这是不是意味着它存在于未装箱状态?那么,在这种情况下,如果我访问int I = lstInt[0],在这种情况下会发生什么?
谢谢.
在这种情况下,10'盒装'并存储在堆中?或者它作为未装箱的值类型存在?
由于您定义了一个类型数组,因此该值不会加框int[].
所以当我重新访问该项时,int I = arrInt [0]会发生什么?
在这种情况下,该值直接从数组内的内存位置读取.没有取消装箱.只是一个32位值的简单副本.
但我不明白,如果在泛型中List的情况下整数值是如何存储的?
在后台,List<T>内部将值存储在T[]数组中.所以那里没有拳击比赛.如果您反编译List<T>该类,您将看到其Items属性(索引器)看起来像这样:
public T this[int index]
{
get
{
if (index >= this._size) ThrowHelper.ThrowArgumentOutOfRangeException();
return this._items[index];
}
set
{
if (index >= this._size) ThrowHelper.ThrowArgumentOutOfRangeException();
this._items[index] = value;
this._version++;
}
}
Run Code Online (Sandbox Code Playgroud)
这里,_items实例字段定义如下:
private T[] _items;
Run Code Online (Sandbox Code Playgroud)
使用泛型集合可以避免拳击的开销
与非泛型版本相比,它避免了拳击的开销ArrayList.在后台ArrayList使用一个object[]数组,导致值类型被装箱.
| 归档时间: |
|
| 查看次数: |
361 次 |
| 最近记录: |