作者:高桥惜员_136 | 来源:互联网 | 2022-12-06 12:32
将整数存储为特定数字类型(uint8,int16,uint32,int64等)的内存含义是什么?我知道每种类型都可以采用的整数范围,但是使用适当的类型是否可以达到一定的内存效率?
例如,在Golang,它“似乎”更有效的人的年龄存储为UINT8而非单元(根据其规范这相当于UINT32或UINT64 https://golang.org/ref/spec#Numeric_types)
1> icza..:
固定大小的整数
固定大小的整数需要精确的内存量。对单个变量使用较小的整数类型“在此处和那里”,您将仅获得少量内存(如果有)。同样,当用作结构字段类型时,由于隐式填充,您可能再也不会获得任何好处。
当您使用固定大小的整数作为(大)切片或数组的元素类型时,内存增益可能会显着且可观。
使用固定大小整数的另一个(可能更重要)原因可能是要传达您存储在整数中的内容。您可以很好地使用int32
或int64
键入来存储字节,但是明显的浪费是,它们不传递存储在其中的数据的有效范围。
另一点是效率。您总是可以int64
代替其他有符号整数类型使用,但是在某些体系结构上执行运算int64
可能需要多次寄存器操作,因此速度相当慢。同样,rune
类型(的别名int32
)清楚地表明您打算将其用于unicode代码点。
另一点是一致性。如果您习惯int32
将某物建模在一个地方,则应坚持并在所有地方使用相同的类型。这在Go中比在其他语言中更重要,因为Go的类型系统是严格的(比大多数其他语言的类型更严格),这意味着如果您具有type的值int32
,则不能在int64
没有显式的情况下将其分配给type 的变量,反之亦然转换。
int
与固定大小的整数
类型int
和uint
不是固定大小,而是根据规范:数字类型:
uint either 32 or 64 bits
int same size as uint
当使用int
时,针对不同的体系结构,编译器可能会生成更多优化的代码。以32位架构为目标时,通常 int
为32位;以64位架构为目标时,通常为64位。这意味着的大小int
将与目标体系结构的寄存器大小匹配,因此可以通过单个寄存器操作有效地执行整数运算。int64
例如,如果使用,则可能需要执行多个(寄存器)操作才能在32位体系结构上执行单个整数操作。
我喜欢认为int
是一种整数类型,用于以其认为合适的最佳方式描述和传达Go运行时数据结构的某些部分或组件。例如,索引数组或切片或描述其大小int
是要使用的“自然”类型。
规格:长度和容量:
内置函数len
并cap
接受各种类型的参数并返回type的结果int
。该实现可确保结果始终适合int
。例如,int
建议或强制为切片或数组建立索引或描述其长度和容量是“自然”类型。
当for range
对数组,切片或string
值使用至少一个迭代变量的语句时,迭代变量(“索引”)的类型为int
。
另请注意,Rob Pike已为Go 2提出了将其更改int
为任意精度的建议。建议:规范:将int更改为任意精度