使用特定数字类型而不是其他数字类型有何含义

2024-02-14

将整数存储为特定数字类型(uint8、int16、uint32、int64 等)对内存有何影响?我知道每种类型可以采用的整数范围,但是通过使用适当的类型是否可以实现一定的内存效率?

例如,在 Golang 中,将某人的年龄存储为 uint8 而不是单位(根据其规范相当于 uint32 或 uint64)“似乎”更有效https://golang.org/ref/spec#Numeric_types https://golang.org/ref/spec#Numeric_types)


固定大小的整数

固定大小的整数需要精确的内存量。对单个变量“到处”使用较小的整数类型,您只会获得少量的内存(如果有的话)。此外,当用作结构体字段的类型时,由于隐式填充,您可能再次无法获得任何内容。

当您使用固定大小的整数作为(大)切片或数组的元素类型时,内存增益可能会非常明显且相当大。

使用固定大小整数的另一个(也许更重要)原因可能是为了传达您在其中存储的内容。你也可以使用int32 or int64类型来存储字节,但显然是一种浪费,它们不传达有效范围其中存储的数据。

还有一点就是效率。你总是可以使用int64代替其他有符号整数类型,但在某些架构上执行操作int64可能需要多个寄存器操作,因此速度要慢得多。还有rune类型(别名为int32) 清楚地表明您打算将其用于 unicode 代码点。

另一点是一致性。如果你使用int32要在一个地方建模某些东西,你应该坚持它并在所有地方使用相同的类型。这在 Go 中比在其他语言中更重要,因为 Go 的类型系统很严格(比大多数其他语言更严格),这意味着如果您有一个类型的值int32,你不能将它分配给变量int64类型,反之亦然,无需显式转换。

int与固定大小整数

类型int and uint尺寸不是固定的,而是根据规格: 数字类型: https://golang.org/ref/spec#Numeric_types

uint     either 32 or 64 bits
int      same size as uint

当你使用int,编译器在针对不同的体系结构时可能会生成更优化的代码。Usually int当针对 32 位架构时为 32 位,当针对 64 位架构时为 64 位。这意味着尺寸int将匹配目标体系结构的寄存器大小,因此可以使用单个寄存器操作有效地执行整数运算。如果你使用int64例如,可能需要执行多个(寄存器)操作才能在 32 位架构上执行单个整数操作。

我喜欢想int是一种整数类型,用于以它认为合适的最佳方式描述和传达 Go 运行时数据结构的某些部分或组件。例如,索引数组或切片,或描述它们的大小,int是使用的“自然”类型。

规格: 长度及容量: https://golang.org/ref/spec#Length_and_capacity

内置函数len and cap接受各种类型的参数并返回类型的结果int。该实现保证结果始终适合int。例如索引切片或数组,或描述它们的长度和容量,int是推荐或强制执行的“自然”类型。

当使用for range数组、切片或上至少有一个迭代变量的语句string值,迭代变量(“索引”)将是类型int.

另请注意,Rob Pike 已提出一项关于 Go 2 更改的提案int任意精度。提案:spec:将 int 更改为任意精度 https://github.com/golang/go/issues/19623

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用特定数字类型而不是其他数字类型有何含义 的相关文章

随机推荐