首页 > 其他 > 详细

内存对齐(go)

时间:2020-11-18 14:39:03      阅读:28      评论:0      收藏:0      [点我收藏+]

内存对齐

概念:

  内存对齐应该是编译器的“管辖范围”。编译器为程序中的每个“数据单元”安排在适当的位置上。(貌似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

 

内存对齐(go)

原文:https://www.cnblogs.com/huangliang-hb/p/13999131.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!