为什么 List<T> 的 MoveNext() 实现使用 localList?
Why does List<T>'s MoveNext() implementation use a localList?
我在 List<T>
中阅读了 MoveNext() 的实现:
public bool MoveNext() {
List<T> localList = list;
if (version == localList._version && ((uint)index < (uint)localList._size))
{
current = localList._items[index];
index++;
return true;
}
return MoveNextRare();
}
将对 list
的引用复制到本地变量 localList
中有什么意义?
如果它们都指向同一个对象,为什么不能将 localList
的所有实例替换为 list
?
这可能是性能问题。访问局部变量比访问实例变量稍快。并且 - 因为 List
可能是 CLR 中最常用的 类 之一 - 具有良好的性能很重要。
局部变量可以直接从堆栈或者寄存器中读取,而实例变量读取对象的地址,然后获取相对于该地址的值。
我在 List<T>
中阅读了 MoveNext() 的实现:
public bool MoveNext() {
List<T> localList = list;
if (version == localList._version && ((uint)index < (uint)localList._size))
{
current = localList._items[index];
index++;
return true;
}
return MoveNextRare();
}
将对 list
的引用复制到本地变量 localList
中有什么意义?
如果它们都指向同一个对象,为什么不能将 localList
的所有实例替换为 list
?
这可能是性能问题。访问局部变量比访问实例变量稍快。并且 - 因为 List
可能是 CLR 中最常用的 类 之一 - 具有良好的性能很重要。
局部变量可以直接从堆栈或者寄存器中读取,而实例变量读取对象的地址,然后获取相对于该地址的值。