Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# JIT编译器如何处理值类型?_C#_Jit - Fatal编程技术网

C# JIT编译器如何处理值类型?

C# JIT编译器如何处理值类型?,c#,jit,C#,Jit,我正在深入阅读乔恩·斯基特的《C》。引自第三章: JIT可以以一种特别聪明的方式来处理值类型 在许多情况下都能消除装箱和拆箱。在某些方面 在这两种情况下,这会对性能产生巨大的影响 速度和内存消耗 有人能解释一下这到底是什么意思吗?最好用一个例子来解释一下。我认为这些类型中的许多并没有被视为其定义类型的对象。例如int不必被视为结构,可以直接在寄存器中处理。添加两个整数不是由重载运算符调用处理的,而是由cpu直接完成的 让我们以List为例。这是由一个真正的int[]支持的,JIT将专门为int类

我正在深入阅读乔恩·斯基特的《C》。引自第三章:

JIT可以以一种特别聪明的方式来处理值类型 在许多情况下都能消除装箱和拆箱。在某些方面 在这两种情况下,这会对性能产生巨大的影响 速度和内存消耗


有人能解释一下这到底是什么意思吗?最好用一个例子来解释一下。

我认为这些类型中的许多并没有被视为其定义类型的对象。例如int不必被视为结构,可以直接在寄存器中处理。添加两个整数不是由重载运算符调用处理的,而是由cpu直接完成的

让我们以
List
为例。这是由一个真正的
int[]
支持的,JIT将专门为
int
类型参数JIT编译代码,这样在
List
中使用
T
的任何代码都应该得到任何优化,就好像代码是为整数编写的一样

将其与Java的泛型进行比较,Java的泛型中唯一有效的类型参数是类类型——因此,即使可以有效地编写:

// Java code!
List<Integer> integers = new ArrayList<Integer>();
integers.add(10);
int x = integers.get(0); // x = 10
//Java代码!
列表整数=新的ArrayList();
整数。加(10);
int x=整数。获取(0);//x=10

在后台执行装箱和取消装箱操作的。等效的C#code根本不需要装箱。

装箱描述了将值类型保存为
对象的过程,例如:
对象o=13,而取消装箱描述了从对象检索值的过程:
int十三=(int)o。这就是你想知道的吗?不。我想知道上面这句话的确切含义“JIT可以以一种特别聪明的方式处理值类型,在许多情况下能够消除装箱和拆箱。在某些情况下,这可以在速度和内存消耗方面对性能产生巨大的影响。”回答这个问题很危险,乔恩有很多粉丝。但他错了(躲开了那道闪电)。当编译器请求一个框时,Scli20版本的抖动肯定总是框一个值类型。C#编译器可以通过使用opcode.constrated而不是opcode.box来省略方框。再说一次,抖动的版本与我们每天使用的版本不匹配,可能在一个通用方法中有一个角落,允许在运行时删除框,这是可行的。@HansPassant:我没有在那个级别谈论任何东西-我猜它也不是真正特定于JIT的。更重要的是,需要在C#1中装箱的情况不需要在C#2中装箱,JIT也不会经历无意义的装箱操作。我并不是说它忽略了编译器需要的任何装箱。非常感谢Jon。但是Jon可以更轻松地解释下面提到的行。行是:因此,任何使用列表中的T的代码都应该得到任何优化,就好像代码只是为整数编写的一样。