August 2021
Beginner to intermediate
450 pages
6h 1m
Chinese
函数unsafe.Sizeof报告传递给它的参数在内存中占用的字节长度,这个参数可以是任何类型的表达式,不会计算表达式。Sizeof调用返回一个uintptr类型的常量表达式,所以这个结果可以作为数组类型的维度或者用于计算其他的常量。
Sizeof仅报告每个数据结构固定部分的内存占用的字节长度,例如指针或者字符串的长度,但是不会报告诸如字符串内容这种间接内容。非聚合类型的典型长度如下所示,当然准确的长度随工具链的不同而不同。为了可移植性,我们将以字来表示引用类型(或者包含引用的类型)的长度。在32位系统上,字的长度是4个字节;而在64位系统上,字的长度是8个字节。
在类型的值在内存中对齐的情况下,计算机的加载或者写入会很高效。例如,一个两字节值(如int16)的地址应该是一个偶数,一个四字节值(如rune)的地址应该是4的整数倍,一个八字节值(如float64、uint64或者64位指针)的地址应该是8的整数倍。更大整数倍的对齐很少见,即使是像complex128这种大的数据类型。
因此,聚合类型(结构体或数组)的值的长度至少是它的成员或元素长度之和,并且由于“内存间隙”的存在,或许比这个更大一些。内存空位是由编译器添加的未使用的内存地址,用来确保连续的成员或者元素相对于结构体或数组的起始地址是对齐的。
语言规范并没有要求成员声明的顺序对应内存中的布局顺序,所以在理论上,编译器可以自由安排。尽管这样说,但是实际上没人这样做。如果结构体成员的类型是不同的,那么将相同类型的成员定义在一起可以更节约内存空间。例如下面的三个结构体拥有相同的成员,但是第一个定义比其他两个定义要多占至多50%的内存。 ...