Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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
.net 为什么CLR对象引用包含指向对象中间的地址?_.net_Clr - Fatal编程技术网

.net 为什么CLR对象引用包含指向对象中间的地址?

.net 为什么CLR对象引用包含指向对象中间的地址?,.net,clr,.net,Clr,CLRv4中的对象在内存中的布局方式如下: 同步块 指向方法表的指针 用户定义字段 对象引用的实现方式对我来说似乎很奇怪——引用实际上是指向包含指向方法表指针的字段的指针。换句话说,它包含对象的移位地址(它不指向对象的开头,而是在同步块之后)。资料来源: 为什么会以这种方式实施?我相信这可能与性能有关——方法表可能比同步块更容易被访问,在这种情况下,需要的操作更少。然而,如果是这样的话,那么对同步块和指向方法表的指针重新排序会更自然,这样方法表就位于对象的开头。这种布局的原因是什么?它经过了

CLRv4中的对象在内存中的布局方式如下:

  • 同步块
  • 指向方法表的指针
  • 用户定义字段
对象引用的实现方式对我来说似乎很奇怪——引用实际上是指向包含指向方法表指针的字段的指针。换句话说,它包含对象的移位地址(它不指向对象的开头,而是在同步块之后)。资料来源:


为什么会以这种方式实施?我相信这可能与性能有关——方法表可能比同步块更容易被访问,在这种情况下,需要的操作更少。然而,如果是这样的话,那么对同步块和指向方法表的指针重新排序会更自然,这样方法表就位于对象的开头。这种布局的原因是什么?

它经过了微优化,使访问装箱值类型值的机器代码尽可能紧凑。允许它在不调用CLR辅助函数的情况下内联生成。还解释了C#中的一个看似奇怪的限制,即必须始终将X解装箱为完全相同类型的值。在.NET1.x中非常重要,而不是今天的泛型。