存储刚好超过数组末尾的元素的地址
Address where an element just past the end of an array would be stored
根据 ECMA-335:
II.14.4.2 Managed pointers
Managed pointers (&) can point to an instance of a value type, a field of an object, a field of a value
type, an element of an array, or the address where an element just past the end of an array would be
stored (for pointer indexes into managed arrays).
最后一部分我很感兴趣。这是否意味着超出数组末尾的引用有效?如何获得这样的参考(可能使用 IL)? CLR 如何处理那里的读写?
表示指针有效,但不表示解引用有效
例如,如果您有一个包含 10 个 Int32 值的数组,这意味着 10 * 4 个字节,则指向数组开始后第 40 个字节的指针是有效的。
取消引用不是。
这意味着读取或写入该位置无效。
考虑分段 'protected' 内存。
您引用的语句与 C++ 标准相呼应,该标准详细说明了尾后指针必须如何有效且可以安全地进行比较。
C++ 库(算法)的很大一部分使用这种指针作为 'sentinel',等同于例如 EOF。
使用受保护的内存,仅将进程外部的指针值 space 加载到寄存器中可能会导致保护错误。它不会等待取消引用。
这里的实际意思是您数据的最后一个字节可能不是已分配段的最后一个字节。内存管理器将不得不填充 1 个或多个字节。因此允许 compiler/optimizer 始终使用地址寄存器作为指针。
根据 ECMA-335:
II.14.4.2 Managed pointers
Managed pointers (&) can point to an instance of a value type, a field of an object, a field of a value type, an element of an array, or the address where an element just past the end of an array would be stored (for pointer indexes into managed arrays).
最后一部分我很感兴趣。这是否意味着超出数组末尾的引用有效?如何获得这样的参考(可能使用 IL)? CLR 如何处理那里的读写?
表示指针有效,但不表示解引用有效
例如,如果您有一个包含 10 个 Int32 值的数组,这意味着 10 * 4 个字节,则指向数组开始后第 40 个字节的指针是有效的。
取消引用不是。
这意味着读取或写入该位置无效。
考虑分段 'protected' 内存。
您引用的语句与 C++ 标准相呼应,该标准详细说明了尾后指针必须如何有效且可以安全地进行比较。 C++ 库(算法)的很大一部分使用这种指针作为 'sentinel',等同于例如 EOF。
使用受保护的内存,仅将进程外部的指针值 space 加载到寄存器中可能会导致保护错误。它不会等待取消引用。
这里的实际意思是您数据的最后一个字节可能不是已分配段的最后一个字节。内存管理器将不得不填充 1 个或多个字节。因此允许 compiler/optimizer 始终使用地址寄存器作为指针。