【发布时间】:2013-12-19 13:02:45
【问题描述】:
我用Reflector阅读了.NET4.0的System.Collections.Generic.List<T>类的源码,
我有一些问题。
代码如下:
[__DynamicallyInvokable]
public void Add(T item)
{
if (this._size == this._items.Length)
{
this.EnsureCapacity(this._size + 1);
}
this._items[this._size++] = item;
this._version++;
}
private void EnsureCapacity(int min)
{
if (this._items.Length < min)
{
int num = (this._items.Length == 0) ? 4 : (this._items.Length * 2);
if (num > 0x7fefffff)
{
num = 0x7fefffff;
}
if (num < min)
{
num = min;
}
this.Capacity = num;
}
}
[__DynamicallyInvokable]
public int Capacity
{
// omitted code
set
{
if (value < this._size)
{
ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.value, ExceptionResource.ArgumentOutOfRange_SmallCapacity);
}
if (value != this._items.Length)
{
if (value > 0)
{
T[] destinationArray = new T[value];
if (this._size > 0)
{
Array.Copy(this._items, 0, destinationArray, 0, this._size);
}
this._items = destinationArray;
}
else
{
this._items = List<T>._emptyArray;
}
}
}
}
-
通过将所有元素复制到新数组来调整数组大小是最好的方法还是唯一的方法?
-
为什么用“0x7fefffff”检查“num”?为什么“0x7fefffff”很特别?
-
为什么他们可以直接使用“4”和“0x7fefffff”?它们不是神奇的数字吗?
谢谢。
【问题讨论】:
-
作为其他回答此问题的人的说明:
0x7fefffff=2146435071=2^31 -
Wiki 说要这样做 en.wikipedia.org/wiki/Dynamic_array。第一个问题。
-
@AdamKewley 实际上 2^31 = 2147483648。
-
@Dukeling 是的,抱歉,我将数字四舍五入到最接近的整数。然而,计算系统需要一个字面的解释,我的错。
-
@AdamKewley:
2^31 = 0x80000000。另一方面2^31 - 2^20 - 1 = 0x7feffffff.
标签: c# performance algorithm list memory-management