内存对齐(go)

内存对齐

概念:

  内存对齐应该是编译器的“管辖范围”。编译器为程序中的每个“数据单元”安排在适当的位置上。(貌似C语言是可以允许你干预“内存对齐”的)

原因:

1. 平台(移植性):不是所有的硬件平台都能够访问任意地址上的任意数据

2. 性能原因:访问未对齐的内存,cpu需要做两次内存访问,而对齐的内存只需访问一次

操作系统这样做的原因:拿空间换时间,提高效率。

 

规则:

1. 每次对齐都找当前成员变量类型的长度: 作为对齐数

2. 对齐数就是其结构体成员中最大的对齐数 (最终大小,也是对齐数的整数倍)

type Part1 struct {
    A byte // 1
    B int32
    C int8
}

X就是padding,即填补的空间
分析: AXXX|BBBB|CXXX    12字节  对齐数4

type Part1 struct {
    B int32
    A byte // 1
    C int8
}

分析: BBBB|ACXX     8字节 对齐数4

 空类大小为1个字节:因为要插入一个char类型的指针来标识一个唯一的对象

 

type Part0 struct {
}

type Part1 struct {
    A byte // 1
    B int16
}

type Part2 struct {
    A byte
    B int16
    C int8
    D int64
    E int32
}

type Part3 struct {
    A byte
    B int32
    C int8
    D int64
    E int32
}

func main() {
    fmt.Printf("part0 size: %d, align: %d\n", unsafe.Sizeof(Part0{}), unsafe.Alignof(Part0{}))
    fmt.Printf("part1 size: %d, align: %d\n", unsafe.Sizeof(Part1{}), unsafe.Alignof(Part1{}))
    fmt.Printf("part2 size: %d, align: %d\n", unsafe.Sizeof(Part2{}), unsafe.Alignof(Part2{}))
    fmt.Printf("part3 size: %d, align: %d\n", unsafe.Sizeof(Part3{}), unsafe.Alignof(Part3{}))
}
part0 size: 0, align: 1
part1 size: 4, align: 2
part2 size: 24, align: 8
part3 size: 32, align: 8

 

posted @ 2020-11-18 12:34  天之草  阅读(243)  评论(0编辑  收藏  举报