Go lang中特定类型(int64 / uint64)的常规类型(int / uint)有哪些优点?

时间:2013-05-07 19:54:12

标签: performance types int go

我了解intuint是64位有符号/无符号整数 - 就像int64 / uint64一样。我也理解int不仅仅是int64的别名(例如byte - > uint8),因此需要转换int64int,反之亦然。但是使用一个比另一个有什么好处?使用常规类型是否有任何运行时性能损失?

很抱歉,如果这是一个常见的问题 - 我已经用Google搜索了答案(也在这里搜索过),因为我以为其他人可能已经出现过,但没有找到任何人回答这个问题它们如何影响性能(如果有的话),内存使用情况(我不猜测它们是否是64位整数?)以及编译器如何处理它们。

编辑:我知道{32}架构上的int / unit是32位。为了简洁和比较喜欢,我假设这是一个64位的Golang环境。

3 个答案:

答案 0 :(得分:16)

在64位体系结构上,

intuint仅为64位。在32位架构上,它们是32位。

一般的答案是,除非您需要一定的精度,否则坚持使用与当前架构上的字大小相同的数据类型(例如32位架构上的32位)通常会稍微提高效率。

答案 1 :(得分:6)

intuint对应于Go实现和运行时中基本Go数据结构的最大可能长度。 stringmap[K]T[]Tchan T的长度始终符合int[]Tchan T的容量总是适合int

通过make的分配必然会返回一个长度和容量始终适合int的对象。内置函数append返回一个长度和容量不超过int的切片。插入新键值对后,地图的长度(已定义键的数量)总是适合int

主要的好处是 intuint最小(就位数而言)数据类型,可以安全地在Go程序中使用与常见的Go数据类型(如切片和地图)结合使用。

int的大小独立于指针*T的大小。与*T对应的整数类型为uintptr。从理论上讲,Go实现可以选择将int映射到int16 - 许多Go程序仍可正常工作,但将分配大小限制为15位可能过于严格,会导致运行时出现混乱。

在64位体系结构上,Go 1.0具有intuint 32位长,Go 1.1 64位长(参见Go 1.1 Release Notes)。此更改将增加64位体系结构上某些Go程序的内存使用量。

在Go程序中明确使用int64代替int会使Go 1.0和32位架构下的速度变慢,因为:

  • intint64

  • 之间的转化
  • 某些CPU指令(例如除法)的性能取决于操作数的大小

在Go程序中明确使用int64代替int可以在64位体系结构的Go 1.0下更快,因为:

  • 如果所有操作数都是64位,编译器可以生成更有效的地址和偏移计算代码。计算地址和偏移时混合32位和64位操作数的速度较慢。

访问uint16时使用[1<<16]T作为索引,允许编译器删除绑定的检查指令。

答案 2 :(得分:4)

除了int是“native”size slice之外,数组索引是int而不是int64或int32。