gpt4 book ai didi

go - 使用特定数字类型而不是其他数字类型意味着什么

转载 作者:IT王子 更新时间:2023-10-29 01:20:50 25 4
gpt4 key购买 nike

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

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

最佳答案

固定大小的整数

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

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

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

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

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

int 与固定大小的整数

类型intuint 不是固定大小,而是根据Spec: Numeric types:

uint     either 32 or 64 bits
int same size as uint

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

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

Spec: Length and capactiy:

The built-in functions len and cap take arguments of various types and return a result of type int. The implementation guarantees that the result always fits into an int. For example indexing slices or array, or to describe their length and capacity, int is the "natural" type recommended or enforced.

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

另请注意,Rob Pike 为 Go 2 提出了将 int 更改为任意精度的提案。 proposal: spec: change int to be arbitrary precision

关于go - 使用特定数字类型而不是其他数字类型意味着什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52076575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com