Go   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了golang 字节对齐大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

最近在做一些性能优化的工作,其中有个结构体占用的空间比较大,而且在内存中的数量又特别多,就在想有没有优化的空间,想起了 c 语言里面的字节对齐,通过简单地调整一下字段的顺序,就能省出不少内存,这个思路在 golang 里面同样适用

基本数据大小

在这之前先来看下 golang 里面基本的类型所占数据的大小

So(unsafe.Sizeof(true),ShouldEqual,1)
So(unsafe.Sizeof(int8(0)),1)
So(unsafe.Sizeof(int16(0)),2)
So(unsafe.Sizeof(int32(0)),4)
So(unsafe.Sizeof(int64(0)),8)
So(unsafe.Sizeof(int(0)),8)
So(unsafe.Sizeof(float32(0)),4)
So(unsafe.Sizeof(float64(0)),8)
So(unsafe.Sizeof(""),16)
So(unsafe.Sizeof("Hello world"),16)
So(unsafe.Sizeof([]int{}),24)
So(unsafe.Sizeof([]int{1,2,3}),24)
So(unsafe.Sizeof([3]int{1,24)
So(unsafe.Sizeof(map[String]String{}),8)
So(unsafe.Sizeof(map[String]String{"1": "one","2": "two"}),8)
So(unsafe.Sizeof(struct{}{}),0)
    @H_696_9@bool 类型然只有一位,但也需要占用1个字节,因为计算机是以字节为单位 @H_696_9@64为的机器,一个 int 占8个字节 @H_696_9@String 类型占16个字节,内部包含一个向数据的指针(8个字节)和一个 int 的长度(8个字节) @H_696_9@slice 类型占24个字节,内部包含一个向数据的指针(8个字节)和一个 int 的长度(8个字节)和一个 int 的容量(8个字节) @H_696_9@map 类型占8个字节,是一个指向 map 结构的指针 @H_696_9@可以用 struct{} 表示空类型,这个类型不占用任何空间,用这个作为 map 的 value,可以讲 map 当做 set 来用

字节对齐

结构体中的各个字段在内存中并不是紧凑排列的,而是按照字节对齐的,比如 int 占8个字节,那么就只能写在地址为8的倍数的地址处,至于为什么要字节对齐,主要是为了效率虑,而更深层的原理看了一下网上的说法,感觉不是很靠谱,就不瞎说了,感兴趣可以自己研究下

// |x---|
So(unsafe.Sizeof(struct {
    i8 int8
}{}),1)

简单封装一个 int8 的结构体,和 int8 一样,仅占1个字节,没有额外空间

// |x---|xxxx|xx--|
So(unsafe.Sizeof(struct {
    i8  int8
    i32 int32
    i16 int16
}{}),12)

// |x-xx|xxxx|
So(unsafe.Sizeof(struct {
    i8  int8
    i16 int16
    i32 int32
}{}),8)

这两个结构体里面的内容完全一样,调整了一下字段顺序,节省了 33% 的空间

// |x---|xxxx|xx--|----|xxxx|xxxx|
So(unsafe.Sizeof(struct {
    i8  int8
    i32 int32
    i16 int16
    i64 int64
}{}),24)

// |x-xx|xxxx|xxxx|xxxx|
So(unsafe.Sizeof(struct {
    i8  int8
    i16 int16
    i32 int32
    i64 int64
}{}),16)

这里需要注意的是 int64 只能出现在8的倍数的地址处,因此第一个结构体中,有连续的4个字节是空的

type I8 int8
type I16 int16
type I32 int32

So(unsafe.Sizeof(struct {
    i8  I8
    i16 I16
    i32 I32
}{}),8)

给类型重命名之后,类型的大小并没有发生改变

大佬总结

以上是大佬教程为你收集整理的golang 字节对齐全部内容,希望文章能够帮你解决golang 字节对齐所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。