unsafe

最后更新于:2022-04-02 02:42:08

[TOC] > [参考](https://mp.weixin.qq.com/s/RKHNKY_EVF2vR0zLQVU5_A) ## 语法 ``` func Sizeof(v ArbitraryType) uintptr func Alignof(v ArbitraryType) uintptr func Offsetof(v ArbitraryType) uintptr ``` ## unsafe.Sizeof ``` a := int8(1) fmt.Printf("%+v\n", unsafe.Sizeof(a)) // 1 b := int16(1) fmt.Printf("%+v\n", unsafe.Sizeof(b)) // 2 c := "a" fmt.Printf("%+v\n", unsafe.Sizeof(c)) // 16 d := strings.Repeat("hello word ", 100) fmt.Printf("%+v\n", unsafe.Sizeof(d)) // 16 e := struct { a int16 // 2 b int16 // 2 }{ a: 1, b: 2, } fmt.Printf("%+v\n", unsafe.Sizeof(e)) //4 ``` ## unsafe.Offset 偏移值 ``` e:= struct { a int32 // 2 b int16 // 2 c int16 // 2 }{ a: 1, b: 2, c: 1, } fmt.Printf("%+v\n", unsafe.Offsetof(e.a)) // 0 fmt.Printf("%+v\n", unsafe.Offsetof(e.b)) // 4 fmt.Printf("%+v\n", unsafe.Offsetof(e.c)) // 6 ``` 第一个字段`e.e`占了前 4 个字节, 而第二个字段`e.b`占了接下来的 2 个字节 而第二个字段`e.c`占了接下来的 2 个字节 ## unsafe.Alignof **alignment(数据结构对齐)** 它让数据在内存中以某种的布局来存放,使该数据的读取能够更加的快速 ``` type X struct { n1 int8 n2 int16 } // error:因为 alignment 的缘故,size(x) 不等于x // size(`X`) = size(`n1`) + size(`n2`) = 1 + 2 = 3 ``` 1. `n2`的**内存起始地址应该是自身大小的整数倍**,也就是说它的起始地址只能是 0、2、4、6、8 等偶数 2. **整个结构体的大小,是结构体中最大的字段的大小的整数倍** ``` // Sizeof(First.a) + 7 个空闲的字节 + Sizeof(First.b) + Sizeof(First.c) + 7 个空闲的字节 = 24 字节 type First struct { a int8 b int64 c int8 } // Sizeof(Second.a) + Sizeof(Second.b) + 6 个空闲的字节 + Sizeof(Second.b) = 16 字节 type Second struct { a int8 c int8 b int64 } fmt.Println("Big brain time: ", unsafe.Sizeof(First{}) == unsafe.Sizeof(Second{})) ``` >[info] 结构体的属性最好是从小到达或从大到小
';