我了解int
和uint
是64位有符号/无符号整数 - 就像int64
/ uint64
一样。我也理解int
不仅仅是int64
的别名(例如byte
- > uint8
),因此需要转换int64
到int
,反之亦然。但是使用一个比另一个有什么好处?使用常规类型是否有任何运行时性能损失?
很抱歉,如果这是一个常见的问题 - 我已经用Google搜索了答案(也在这里搜索过),因为我以为其他人可能已经出现过,但没有找到任何人回答这个问题它们如何影响性能(如果有的话),内存使用情况(我不猜测它们是否是64位整数?)以及编译器如何处理它们。
编辑:我知道{32}架构上的int
/ unit
是32位。为了简洁和比较喜欢,我假设这是一个64位的Golang环境。
答案 0 :(得分:16)
int
和uint
仅为64位。在32位架构上,它们是32位。
一般的答案是,除非您需要一定的精度,否则坚持使用与当前架构上的字大小相同的数据类型(例如32位架构上的32位)通常会稍微提高效率。
答案 1 :(得分:6)
int
和uint
对应于Go实现和运行时中基本Go数据结构的最大可能长度。 string
,map[K]T
,[]T
和chan T
的长度始终符合int
,[]T
和chan T
的容量总是适合int
。
通过make
的分配必然会返回一个长度和容量始终适合int
的对象。内置函数append
返回一个长度和容量不超过int
的切片。插入新键值对后,地图的长度(已定义键的数量)总是适合int
。
主要的好处是 int
和uint
是最小(就位数而言)数据类型,可以安全地在Go程序中使用与常见的Go数据类型(如切片和地图)结合使用。
int
的大小独立于指针*T
的大小。与*T
对应的整数类型为uintptr
。从理论上讲,Go实现可以选择将int
映射到int16
- 许多Go程序仍可正常工作,但将分配大小限制为15位可能过于严格,会导致运行时出现混乱。
在64位体系结构上,Go 1.0具有int
和uint
32位长,Go 1.1 64位长(参见Go 1.1 Release Notes)。此更改将增加64位体系结构上某些Go程序的内存使用量。。
在Go程序中明确使用int64
代替int
会使Go 1.0和32位架构下的速度变慢,因为:
int
和int64
某些CPU指令(例如除法)的性能取决于操作数的大小
在Go程序中明确使用int64
代替int
可以在64位体系结构的Go 1.0下更快,因为:
访问uint16
时使用[1<<16]T
作为索引,允许编译器删除绑定的检查指令。
答案 2 :(得分:4)
除了int是“native”size slice之外,数组索引是int而不是int64或int32。