阅读所有可能的 C# 数组初始化语法我想知道为什么 C# 总是推断出一个较小数据类型的数组,int/Int32
例如byte
orshort
就足够了。
new[] { 30, 130, 230 } // sbyte[] suffices but becomes int[]
new[] { -1, 125, -119 } // sbyte[] suffices but becomes int[]
new[] { -31647, -1337, 23456} // short suffices but becomes int[]
在引用的问题中,Eric Lippert 指出使用了“最佳类型” - 见下文,但int
最佳类型如何?如果我们要矫枉过正,为什么不使用long
呢?
数组元素的类型是通过计算所有具有类型的给定元素中的最佳类型(如果有的话)来推断的。所有元素都必须隐式转换为该类型。
我怀疑处理 8 位或 16 位数据类型可能比 32 位结构更快,例如在使用 SIMD 时,其中四个byte
实例可以容纳在一个的寄存器空间中int/Int32
。我知道JIT 编译器没有(广泛)使用 SSE 指令,但是这种“int
无处不在”的用法确保当 JIT 编译器将包含此类优化时它不会有太大帮助。
有人可以详细说明这些事实并说明为什么它总是诉诸于int
吗?
// 编辑 //
我并不真正关心规定没有前缀的文字应该被视为int
. 重新表述这个问题:
为什么使用大于所需的数据类型?为什么规范对文字有这个规则? 什么是优势,因为巨大的缺点是远离未来(SIMD)优化。