Go语言爱好者周刊:第 80 期

polaris · · 7666 次点击
答案:8,16 参考: ```go package main import ( "unsafe" "fmt" ) func main() { type T1 struct { a struct{} x int64 } fmt.Println(unsafe.Sizeof(T1{})) type T2 struct { x int64 a struct{} } fmt.Println(unsafe.Sizeof(T2{})) var x64 int64 var a struct{} var x8 int8 var x16 int16 var x32 int32 var i interface{} fmt.Println(unsafe.Sizeof(a)) fmt.Println(unsafe.Sizeof(x8)) fmt.Println(unsafe.Sizeof(x16)) fmt.Println(unsafe.Sizeof(x32)) fmt.Println(unsafe.Sizeof(i)) fmt.Println(unsafe.Sizeof(x64)) } ``` 结果 ``` 8 16 8 0 1 2 4 16 ```
#1
更多评论
引用Go程序设计语言13.1 > 聚合类型(结构体或数组)的长度至少是它的成员或元素的长度之和,并且由于“内存空隙”的存在,一般会比这个要大。内存空位是由编译器添加的未使用的内存地址,用来确保连续的成员或者元素相对于结构体或数组的起始地址是对齐的。 空结构体(struct{})的Sizeof是0,int64的Sizeof是8。 T1的内存空间是(0,8),总共是8;而T2的内存空间是(8,0),由于要对齐,所以即便后面的是0,但仍需要使用8字节来对齐,因此是16。 但如果在T1和T2里再添加一个int64,它们都是16。大家可以自行尝试。 最后建议,如果结构体成员的类型是不同的,那么将相同类型的成员定义在一起,可以更节约内存空间。
#2