gpt4 book ai didi

c# - 为什么类型转换很昂贵?

转载 作者:行者123 更新时间:2023-12-02 01:05:49 24 4
gpt4 key购买 nike

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

好的,我知道它是针对值类型的,但让我们暂时排除它们。我们只讨论引用类型之间的转换。如果我这样写:

class Animal { }

class Dog : Animal { }

示例 1

var dog = new Dog();

object obj = dog;

示例 2

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

object obj = GetAnimal();

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

我知道它只是一个新的 4 字节指针,必须在线程的本地参数堆栈上分配,新创建的引用指针的对象引用指向相同的旧地址。为什么这是一件昂贵的事情?分配新的对象引用是否占用大量 CPU?然后即使复制相同的对象引用也必须承担该成本,如下例所示:

Animal fish = new Animal();

Animal anotherFish = fish;

那一定是一样贵吧?

最佳答案

转换为基本类型在运行时总是免费的。当你写:

Dog dog = new Dog();
object obj = dog;

JIT 看到:

void* dog = new Dog();
void* obj = dog;

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

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

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

AssertCastValid 是验证运行时类型的代码。这是它可能的样子(尽管它可能不是):

bool AssertCastToDogValid(object obj) { return obj.GetType() == typeof(Dog); }

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

如您所见,向上转换总是免费的,而向下转换通常不是免费的。多么昂贵?这与您在代码中进行的其他操作有关,并且取决于具体情况(层次结构的深度、转换为接口(interface)……)。

关于c# - 为什么类型转换很昂贵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22630036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com