执行这两行代码之间有什么区别:
IList<Class> list = new List<Class>();
Run Code Online (Sandbox Code Playgroud)
和
IList<Class> list = new List<Class>(0);
Run Code Online (Sandbox Code Playgroud)
我被告知,首先,无容量构造函数更有效,因为与具有0容量的构造函数相比,它分配更少的内存.我已经搜索过MSDN,并且在那里写的是列表的默认容量是0但是我没有看到任何逻辑...
任何人都可以证实或否认这一理论吗?
在http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs,cf7f4095e4de7646的帮助下,你可以很容易地回答这个问题.
public List() {
_items = _emptyArray;
}
Run Code Online (Sandbox Code Playgroud)
VS
public List(int capacity) {
if (capacity < 0) ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.capacity, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum);
Contract.EndContractBlock();
if (capacity == 0)
_items = _emptyArray;
else
_items = new T[capacity];
}
Run Code Online (Sandbox Code Playgroud)
正如您自己可以看到的:如果没有提供初始容量(ctor()),则将内部_items数组设置为_emptyArray,这与行为相同ctor(0).这看起来像是所有ctor(0)-calls 的内部优化,以避免(多余的)空数组的分配.
最后,与真实的初始容量相比,上述ctor-calls都没有真正的内存效率.这是数据结构的本质,它相应地动态扩展.因此,每当您事先知道实际容量时,您应该调用ctor(capacity)以避免调整大小(这是在此处实现并在每次写入时调用).
| 归档时间: |
|
| 查看次数: |
108 次 |
| 最近记录: |