C#数组是否保证按顺序存储在内存中?

时间:2015-03-23 01:08:43

标签: c# .net

根据互联网上的许多消息来源,C#数组是按顺序存储的。也就是说,如果我有一个指向数组中第一个元素的指针,比如int *start = &array[0],那么我可以通过array[i]访问*(start + i)

但是,我正在查看存储在C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC#\Specifications\1033中的C#语言规范,我找不到任何保证会出现这种情况的地方。

实际上这可能不是问题,如果说Microsoft和Mono保持他们的实现同步,但我想知道是否有一个官方来源保证数组按顺序存储在内存中。

谢谢!

2 个答案:

答案 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节说明了有关数组的内容:

  

数组元素应按行主要顺序排列在数组对象中(即,与最右边的数组维度相关的元素应从最低到最高的索引连续排列)。为每个数组元素分配的实际存储可以包括特定于平台的存储   填充。