编译时数组边界

时间:2013-11-24 16:27:39

标签: .net arrays type-systems

在研究CLI的内部时,我注意到类型签名可以指定数组边界(在编译时。)例如,而不是:

Byte[,]

我们可以:

Byte[1...100,1...]

如果我没有弄错,就不可能在C#或C ++ / CLI中实际声明类似后者的类型。此外,ECMA-335表明:

  

VES为每个可区分的数组类型创建一个数组类型。通常,数组类型仅通过其元素的类型及其等级来区分。

公共语言规范(CLS)规定了许多限制,包括:

  

只有一个项是数组并且数组的元素类型应该是   需要区分过载。

因此,似乎对CLI的最低级别存在编译时数组边界的支持,但在其他地方则不然。这让我想知道:

  • 在实践中何时会创建/遇到包含此信息的类型签名?是否有的.NET语言?编辑:有些语言可能通常使用基于单一的数组 - 但他们是否将其编码为类型签名?

  • 如果 存在,CLI实际上使用这些信息在哪里? (在我设计CLI实现时,我特别感兴趣。)

据我所知,任何数组都是使用向量的newarr字节码指令创建的,或者对于一般情况使用Array.CreateInstance。这些机制都不接受数组本身的类型签名,因此创建它似乎无法使用此信息。

理论上,通过内联高效的机器代码来计算地址,此信息可用于优化阵列访问。但是,ldelem和朋友只能访问简单的向量;多维数组访问需要一个方法调用,这让我觉得这样的优化可能不会发生。

我必须认为这个机制有一些目的,为了使它成为一个国际标准,但我并没有真正看到它。

1 个答案:

答案 0 :(得分:1)

此信息仅出现在数组类型的签名中,如果没有访问数组对象成员,则它在运行时不可用。这对于将具有不同边界的数组视为不同类型的语言非常重要,Pascal语言就是一个例子。它将array[1..10] of integer类型的变量视为不同且与array[1..11] of integer类型的变量不兼容。