【发布时间】:2014-02-28 13:27:02
【问题描述】:
阅读All possible C# array initialization syntaxes 我想知道为什么C# 总是推断int/Int32 的数组,而byte 或short 等较小的数据类型就足够了。
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 的寄存器空间中。我知道SSE instructions are not (widely) used by the JIT Compiler,但是这种使用“int无处不在”确保当 JIT 编译器包含此类优化时它不会有太大帮助。
谁能详细说明这些事实并说明为什么它总是诉诸int?
// 编辑 //
我并不真正关心规定没有前缀的文字应该被视为int 的规范。换个说法:
为什么要使用大于所需的数据类型?为什么规范对文字有这个规则? 有什么优点,因为巨大的缺点是远离未来 (SIMD) 优化。
【问题讨论】:
-
我猜Java在这里不相关。
-
我认为在 32 位机器中,32 位结构比另一种结构更快。
-
如果我们想要矫枉过正 =>我们不会,操纵 int32 通常比操纵 int8/int16 快
-
@RohitJain - 感谢您的澄清,我已经编辑了我的帖子以删除对 Java 的引用 - 而不仅仅是关键字:)
-
有什么缺点?是什么阻止您在声明数组时显式指定类型?老实说,我不明白你的问题。
标签: c# arrays type-conversion array-initialization