14

我理解int并且uint是 64 位有符号/无符号整数 - 就像int64/ uint64。而且我也明白这int不仅仅是int64(like byte-> uint8is)的别名,因此int64需要int在适用时转换为反之亦然。但是,使用其中一个有什么好处呢?使用通用类型是否有任何运行时性能损失?

抱歉,如果这是一个常见问题 - 我曾在 Google 上搜索过答案(并在此处搜索过),因为我曾认为其他人之前可能已经出现过,但没有找到任何人回答问题如何影响性能(如果有的话),内存使用情况(我猜不是它们都是 64 位整数?)或者编译器如何处理它们。

编辑:我知道int/unit在 32 位架构上是 32 位的。为了简洁起见并进行比较,我假设这是一个 64 位 Golang 环境。

4

3 回答 3

22

int并且uint在 64 位架构上只有 64 位。在 32 位架构上,它们是 32 位。

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

于 2013-05-07T19:58:12.357 回答
8

int并且uint对应于 Go 实现和运行时中基本 Go 数据结构的最大可能长度。的长度string,和总是适合map[K]T,容量和总是适合.[]Tchan Tint[]Tchan Tint

分配 viamake必然会返回一个长度和容量始终适合int. 内置函数append返回一个长度和容量永远不会超过int. 插入新键值对后映射的长度(已定义键的数量)始终适合int.

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

的大小与int指针的大小无关*T。对应的整数类型*Tuintptr。理论上,Go 实现可以选择映射intint16- 许多 Go 程序将保持正常工作,但将分配大小限制为 15 位可能过于严格,并会导致运行时恐慌。

在 64 位架构上,Go 1.0 有int32uint位长,Go 1.1 有 64 位长(参见Go 1.1 发行说明)。此更改将增加某些 Go 程序在 64 位架构上的内存使用量。.

在 Go 1.0 和 32 位架构下显式使用int64而不是int在 Go 程序中会使其变慢,因为:

  • int和之间的转换int64

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

在 Go 1.0 的 64 位架构上显式使用int64而不是int在 Go 程序中可以使其更快,因为:

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

uint16访问时用作索引[1<<16]T允许编译器删除边界检查指令。

于 2013-05-09T09:24:01.787 回答
4

除了 int 是“本机”大小的切片和数组索引是 int 而不是 int64 或 int32。

于 2013-05-07T20:18:52.877 回答