在64位机器上,依然按照32位来进行内存对齐。
package mainimport ("fmt""unsafe")type demo1 struct {a int8b int16c int32}type demo2 struct {a int8c int32b int16}type demo3 struct {c int32a struct{}}type demo4 struct {a struct{}c int32}type Args struct {num1 intnum2 int}type Flag struct {num1 int16num2 int32}func main() {fmt.Println(unsafe.Sizeof(demo1{})) // 8fmt.Println(unsafe.Sizeof(demo2{})) // 12fmt.Println(unsafe.Sizeof(demo3{})) // 8fmt.Println(unsafe.Sizeof(demo4{})) // 4fmt.Println(unsafe.Sizeof(Args{})) // 16fmt.Println(unsafe.Sizeof(Flag{})) // 8}
在 64位机器上,一个 int 占 8 字节。
空 struct{} 的对齐
空 struct{} 大小为 0,作为其他 struct 的字段时,一般不需要内存对齐。但是有一种情况除外:即当 struct{} 作为结构体最后一个字段时,需要内存对齐。因为如果有指针指向该字段, 返回的地址将在结构体之外,如果此指针一直存活不释放对应的内存,就会有内存泄露的问题(该内存不因结构体释放而释放)。
因此,当 struct{} 作为其他 struct 最后一个字段时,需要填充额外的内存保证安全。