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

4
根据互联网上的许多来源,在C#中数组是按顺序存储的。也就是说,如果我有一个指向数组第一个元素的指针,比如int * start = &array [0],那么我可以通过执行*(start + i)访问array[i]
然而,我查阅了存储在C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC#\Specifications\1033中的C#语言规范,我找不到任何保证这种情况的地方。
在实践中,如果微软和Mono保持其实现同步,这可能不是个问题,但我想知道是否有官方来源保证数组在内存中是按顺序存储的。
谢谢!

3
通常情况下,对于托管语言来说,这样做虽然可能可行,但大多数情况下都是一个非常糟糕的主意。 - Joel Coehoorn
2个回答

5

来自CLR的ECMA规范:

I.8.9.1 数组类型

....

数组元素应按行主序在数组对象中布局(即,与最右边的数组维度相关联的元素应从最低到最高索引连续布局)。每个数组元素实际分配的存储空间可以包括特定于平台的填充。(当sizeof指令应用于该数组元素的类型时,返回此存储空间的大小(以字节为单位)。)

因此,在ECMA-335公共语言基础结构的兼容实现中,数组元素将按顺序布局。

但是可能会应用特定于平台的填充,因此在64位平台上的实现可能选择为每个Int32分配64位。


1
然而,由于允许特定于平台的填充,您无法保证来自问题的*(start + i)表达式是有效的(尽管在实践中它将是有效的)。 - Joel Coehoorn
1
Joel Coehoom,我不相信那是真的。它说存储大小(包括特定于平台的填充)由sizeof(T)返回,其中T是存储在数组中的元素的类型。这是在执行指针算术运算时使用的内容。 - zrbecker

3

是的,在.NET中,一维的从零开始的数组(向量)是按顺序存储的。事实上,你可以使用指针和不安全的代码逐个访问数组元素,通过增加指针。

ECMA-335 CLI规范,第1.8.9.1节关于数组有以下说明:

数组元素必须按行主序在数组对象内部进行布局(即,与最右边的数组维度相关联的元素应该按照从最低到最高的索引被连续布局)。为每个数组元素分配的实际存储可以包括特定于平台的填充。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接