将整数存储为特定数字类型(uint8,int16,uint32,int64等)的内存含义是什么?我知道每种类型可以采用的整数范围,但是有一些内存效率可以通过使用适当的类型来实现吗?
例如,在Golang中,将某人的年龄存储为uint8而不是单位(根据其规范https://golang.org/ref/spec#Numeric_types相当于uint32或uint64)“似乎”效率更高。
固定大小的整数需要精确的内存量。对于单个变量,使用较小的整数类型“此处和那里”,如果有的话,您将只获得少量内存。此外,当用作结构字段的类型时,由于隐式填充,您再次可能无法获得任何结果。
当使用固定大小的整数作为(大)切片或数组的元素类型时,内存增益可能会很明显且相当大。
使用固定大小整数的另一个(可能更重要的)原因可能是传达您存储在其中的内容。您也可以使用int32
或int64
类型来存储字节,但显然是浪费,它们不会传达存储在其中的有效数据范围。
另一点是效率。您总是可以使用int64
代替其他有符号整数类型,但在某些架构上执行int64
上的操作可能需要多次注册操作,因此速度要慢得多。此外,rune
类型(int32
的别名)清楚地表明您打算将其用于unicode代码点。
另一点是一致性。如果你使用int32
在一个地方建模,你应该坚持使用它并在任何地方使用相同的类型。这在Go中比在其他语言中更重要,因为Go的类型系统是严格的(比大多数其他语言更严格),这意味着如果你有int32
类型的值,你不能将它分配给int64
类型的变量,反之亦然没有明确的转换。
int
与固定大小的整数类型int
和uint
不是固定的大小,但根据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的运行时数据结构的某些部分或组件。例如,为了索引数组或切片,或描述它们的大小,int
是使用的“自然”类型。
内置函数
len
和cap
接受各种类型的参数并返回int
类型的结果。该实现保证结果始终适合int
。例如索引切片或数组,或描述它们的长度和容量,int
是推荐或强制执行的“自然”类型。
当在数组,切片或for range
值上使用至少一个迭代变量的string
语句时,迭代变量(“索引”)将为int
类型。
另请注意,Rob Pike为Go 2提出了一项建议,将int
更改为任意精度。 proposal: spec: change int to be arbitrary precision
1)固定大小的整数可用于减少应用程序使用的内存。例如,在3D应用程序中使用float32
而不是float64
更有意义,因为显卡无论如何都需要float32
s并且例如使用uint16
而不是uint32
作为绘制索引。
也就是说,对于单个变量,它没有区别,只有当你有大量的值并且可以交换内存的精度时。
2)写入磁盘时,例如使用encoding/binary包,你不能使用int
或uint
,因为它们的大小在操作系统之间变化。您必须使用已知大小的值才能使文件格式明确无误。
3)当与操作系统的API接口时,通常需要使用固定大小的变量。例如,Windows API是一个32位API,这意味着当您加载Windows DLL时,您经常需要使用32位无符号整数作为标志等。