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

Lau*_*nce 10 int performance types go

据我所知,intuint为64位有符号/无符号整数-就像int64/ uint64.而且我也明白这int不仅仅是int64(比如byte- > uint8is)的别名,所以在适用时int64需要转换为int反之亦然.但是使用一个比另一个有什么好处?使用常规类型是否有任何运行时性能损失?

对不起,如果这是一个常见的问题 - 我已经用Google搜索了答案(并在这里也进行了搜索),因为我以为其他人可能已经出现过但没有找到任何人回答这个问题对他们如何影响表现(如果有的话),内存使用(我猜不是,如果它们都是64位整数?),也不是编译器如何处理它们.

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

Lil*_*ard 17

int并且uint在64位体系结构上只有64位.在32位架构上,它们是32位.

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

  • @LaurenceMorgan:编译完代码后,`uint`和`uint64`之间没有区别(假设是64位arch).两者之间的转换是免费的.只有语言才能区分. (3认同)

小智 7

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

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

主要的好处是int并且uint最小的(就位数而言)数据类型,这些数据类型在Go程序中可以安全地与常见的Go数据类型(例如切片和映射)一起使用.

大小int独立于指针的大小*T.对应的整数类型*Tuintptr.从理论上讲,Go实现可以选择映射intint16- 许多Go程序仍然可以正常工作,但是将分配大小限制为15位可能限制太多,并且会导致运行时出现混乱.

在64位体系结构转到1.0有intuint32位长,长转到1.1 64位(见转到1.1版本说明).此更改将增加64位体系结构上某些Go程序的内存使用量..

在Go 1.0和32位体系结构中明确使用int64而不是intGo程序可以使它变慢,因为:

  • 之间的转换intint64

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

在Go程序中明确使用int64而不是int在64位体系结构的Go 1.0下更快,因为:

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

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


Vol*_*ker 5

除了 int 具有“本机”大小之外,切片和数组索引也是 int 而不是 int64 或 int32。