【发布时间】:2011-09-03 18:59:44
【问题描述】:
我同时使用 C++ 和 C#,我一直在想的是是否可以在 C# 中使用泛型来省略接口上的虚函数调用。考虑以下几点:
int Foo1(IList<int> list)
{
int sum = 0;
for(int i = 0; i < list.Count; ++i)
sum += list[i];
return sum;
}
int Foo2<T>(T list) where T : IList<int>
{
int sum = 0;
for(int i = 0; i < list.Count; ++i)
sum += list[i];
return sum;
}
/*...*/
var l = new List<int>();
Foo1(l);
Foo2(l);
在 Foo1 内部,每次访问 list.Count 和 list[i] 都会导致一次虚函数调用。如果这是使用模板的 C++,那么在对 Foo2 的调用中,编译器将能够看到可以省略和内联虚函数调用,因为具体类型在模板实例化时是已知的。
但这同样适用于 C# 和泛型吗?当您调用 Foo2(l) 时,在编译时就知道 T 是一个 List,因此 list.Count 和 list[i] 不需要涉及虚函数调用。首先,这会是一个不会严重破坏某些东西的有效优化吗?如果是这样,编译器/JIT 是否足够聪明,可以进行这种优化?
【问题讨论】: