存储数组末尾后的元素的地址

本文关键字:元素 地址 数组 存储 | 更新日期: 2023-09-27 17:53:39

根据ECMA-335:

II.14.4.2托管指针

托管指针(&)可以指向值类型的实例、对象的字段、值的字段类型,数组的元素,或者地址,数组末尾的元素所在的位置.

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

存储数组末尾后的元素的地址

表示该指针是有效的,但不表示对其解引用是有效的。

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

解引用不是。

考虑分段'受保护'内存。

你引用的语句反映了c++标准,该标准详细说明了指针过尾必须是有效的,并且可以安全地进行比较。大部分c++库(算法)使用这种指针作为"哨兵",相当于EOF。

对于受保护的内存,仅仅将进程空间之外的指针值加载到寄存器中就可能导致保护故障。它不会等待解引用。

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