0

冗余演员表得到优化吗?我可以看到编译器没有优化不必要的向下转换(即castclass)。但现在我对一个更简单的情况感兴趣,“如果编译器优化了不必要的向上转换?” 这个问题只涉及引用类型,而不涉及boxing.

在我看来,这upcast不会产生任何 IL,因此冗余显式upcast根本不需要成本?upcast还是因为 IL 指令是无类型的,所以在幕后仍然存在冗余显式的性能成本?

或者有时会向上转换产生任何 IL 指令?

class Foo
{
}
class Bar : Foo
{
}
bool Test(object x)
{
    return x == null;
}
void Main()
{
    var x = new Bar();
    Console.Write(Test((Foo)x)); // redundant explicit to Foo, and then implicit to Object
    var y = new Bar();           // implicit to Object
    Console.Write(Test(y));
}

IL_0000:  newobj      UserQuery+Bar..ctor
IL_0005:  stloc.0     // x
IL_0006:  ldarg.0     
IL_0007:  ldloc.0     // x
IL_0008:  call        UserQuery.Test
IL_000D:  call        System.Console.Write
IL_0012:  newobj      UserQuery+Bar..ctor
IL_0017:  stloc.1     // y
IL_0018:  ldarg.0     
IL_0019:  ldloc.1     // y
IL_001A:  call        UserQuery.Test
IL_001F:  call        System.Console.Write
4

1 回答 1

1

首先,这在很大程度上是一种微优化。您应该担心使您的代码正确和可读。只有当您识别出性能不佳的部分时,才可以优化这些部分并衡量您的优化是否真的有帮助。

其次,即使 IL 包含一条castclass指令,它仍然可以在 JITed 汇编代码中被优化掉,因此它不会对性能产生任何影响。

第三,我想不出任何需要向上转换castclass(或任何其他指令)的情况。这是因为在 IL 中,方法直接由它们的元数据标记调用,因此不需要向上转换来获得方法的正确重载,或类似的东西。而且 IL 没有类型推断,所以在任何情况下都需要显式指定类型参数,这意味着castclass这里也不需要。

于 2013-07-11T21:30:57.437 回答