将存储刚刚超过数组末尾的元素的地址

时间:2015-06-05 22:05:52

标签: c# .net clr il

根据ECMA-335:

  

II.14.4.2管理指针

     

托管指针(&)可以指向值类型的实例,对象的字段,值的字段   类型,数组的元素,或者刚刚超过数组末尾的元素的地址   存储(用于指针索引到托管数组)

最后一部分让我感兴趣。这是否意味着超出数组末尾的引用是有效的?如何获得这样的参考(可能与IL)? CLR如何处理读写?

2 个答案:

答案 0 :(得分:3)

这意味着指针有效,但并不意味着解除引用它是有效的。

例如,如果你有一个包含10个Int32值的数组,这意味着10 * 4个字节,那么在数组启动后指向第40个字节的指针是有效的。

取消引用它不是

这意味着读取或写入该位置无效。

答案 1 :(得分:2)

考虑分段'保护'存储器中。

你引用的陈述是在回应C ++标准,它详细介绍了指针过去的结尾必须是有效的,并且可以安全地进行比较。 很大一部分C ++库(算法)使用这种指针作为' sentinel',等同于例如EOF。

对于受保护的内存,只需将进程空间外的指针值加载到寄存器中就可能导致保护错误。它不会等待取消引用。

这里实际说的是数据的最后一个字节可能不是已分配段的最后一个字节。内存管理器必须填充1个或更多字节。因此允许编译器/优化器始终使用地址寄存器作为指针。