为什么类型转换费用昂贵?

Wat*_* v2 2 .net c#

为什么类型转换费用昂贵?类型转换需要什么?

好吧,我得到它的价值类型,但让我们暂时排除它们.我们来谈谈引用类型之间的转换.如果我写这个:

class Animal { }

class Dog : Animal { }
Run Code Online (Sandbox Code Playgroud)

例1

var dog = new Dog();

object obj = dog;
Run Code Online (Sandbox Code Playgroud)

例2

public Animal GetAnimal()
{
    return new Dog();
}

object obj = GetAnimal();
Run Code Online (Sandbox Code Playgroud)

上面的示例包含多少类型转换,为什么它们很昂贵?

据我所知,它只是一个新的4字节指针,必须在线程的本地参数堆栈上分配,并且新创建的引用指针的对象引用指向同一个旧地址.为什么这是一件昂贵的事情呢?是否分配了一个新的对象参考CPU密集型?然后,即使复制相同的对象引用也必须包含该成本,如下例所示:

Animal fish = new Animal();

Animal anotherFish = fish;
Run Code Online (Sandbox Code Playgroud)

那必须同样贵吗?

usr*_*usr 5

转换为基类型在运行时始终是空闲的.当你写:

Dog dog = new Dog();
object obj = dog;
Run Code Online (Sandbox Code Playgroud)

JIT认为:

void* dog = new Dog();
void* obj = dog;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,JIT并不特别关心不同的引用类型.对它来说,所有的ref类型都只是指针.JIT完全能够处理冗余的冗余变量和赋值.

对派生类的强制转换通常具有运行时成本,因为必须进行运行时检查.这有时可以优化.如果确实需要检查,它看起来有点像这样:

object obj = new Dog();
AssertCastValid<Dog>(obj);
Dog dog = obj; //Invalid C#, but OK for the JIT internally
Run Code Online (Sandbox Code Playgroud)

使用AssertCastValid代码来验证运行时类型.下面是它什么像(虽然它可能没有):

bool AssertCastToDogValid(object obj) { return obj.GetType() == typeof(Dog); }
Run Code Online (Sandbox Code Playgroud)

(这是不正确的,但说明了这个想法.)

正如你所看到的,upcasts总是免费的,而downcasts通常不是免费的.多么昂贵?这与您在代码中的其他内容相关,它取决于具体情况(层次结构的深度,转换为接口,......).