根据互联网上的许多消息来源,C#数组是按顺序存储的。也就是说,如果我有一个指向数组中第一个元素的指针,比如int *start = &array[0]
,那么我可以通过array[i]
访问*(start + i)
。
但是,我正在查看存储在C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC#\Specifications\1033
中的C#语言规范,我找不到任何保证会出现这种情况的地方。
实际上这可能不是问题,如果说Microsoft和Mono保持他们的实现同步,但我想知道是否有一个官方来源保证数组按顺序存储在内存中。
谢谢!
答案 0 :(得分:5)
来自ECMA specification for the CLR:
I.8.9.1数组类型
...
数组元素应以row-major的形式放置在数组对象中 顺序(即与最右边的数组相关联的元素) 尺寸应从最低到最高连续布置 指数)。为每个数组元素分配的实际存储空间可以 包括特定于平台的填充。 (此存储的大小,在 当应用于sizeof指令时,由sizeof指令返回 该数组元素的类型。)
所以是的,在ECMA-335的补充实现中,数组中的公共语言基础结构元素将按顺序排列。
但是可能会应用特定于平台的填充,因此64位平台上的实现可能选择为每个Int32分配64位。
答案 1 :(得分:3)
是的,.NET中的一维零基数组(向量)是按顺序存储的。实际上,您可以使用带有指针的不安全代码,通过递增指针逐个访问数组元素。
ECMA-335 specification of CLI,第1.8.9.1节说明了有关数组的内容:
数组元素应按行主要顺序排列在数组对象中(即,与最右边的数组维度相关的元素应从最低到最高的索引连续排列)。为每个数组元素分配的实际存储可以包括特定于平台的存储 填充。