欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

Gostruct内存对齐(64位cpu和操作系统)

时间:2023-07-01

在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 最后一个字段时,需要填充额外的内存保证安全。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。