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] 结构体的属性最好是从小到达或从大到小
';