我正在深入阅读 Jon Skeet 的 C#。引用第三章:
JIT 可以以一种特别巧妙的方式处理值类型,从而在许多情况下设法消除装箱和拆箱。在某些情况下,这会对速度和内存消耗方面的性能产生巨大影响。
有人可以解释一下这到底是什么意思,最好举个例子吗?
让我们List<int>
举个例子。这是由正版支持的int[]
,JIT 将专门为int
类型参数 JIT 编译代码,因此任何使用inside 的代码T
都List<T>
应该得到任何优化,就好像代码只是为整数编写的一样。
将此与 Java 的泛型进行比较,其中唯一有效的类型参数是类类型 - 所以即使它是有效的编写:
// Java code!
List<Integer> integers = new ArrayList<Integer>();
integers.add(10);
int x = integers.get(0); // x = 10
它在后台执行装箱和拆箱操作。等效的 C# 代码根本不涉及装箱。
我认为 Jon 提到许多这些类型不被视为其定义类型的对象。例如; int 不必被视为结构,可以直接在寄存器中处理。添加两个整数不是由重载的运算符调用处理的,而是由 cpu 直接完成的。