【golang】struct的内存优化问题

struct的内存分配

struct的内存是开辟了一段连续的内存空间,以4个字节为基础,超过四个字节的变量,会独占一行。
比如golang中bool类型变量占用1B,uint32占用4B

type Tes struct {
    A bool
    B uint32
    C bool
}

因为,A占用1字节,剩余3字节,而B占用4字节剩余空间不够重新开辟一行空间,剩余0字节空间,则C也需重新开辟一行占用1字节。
所以结构体占用了3个4B空间。

    var t Tes
    fmt.Println("变量内存:", unsafe.Sizeof(t))
    fmt.Println("....................")
    fmt.Println("字段A内存:", unsafe.Sizeof(t.A))
    fmt.Println("字段A偏移:", unsafe.Offsetof(t.A))
    fmt.Println("....................")
    fmt.Println("字段B内存:", unsafe.Sizeof(t.B))
    fmt.Println("字段B偏移:", unsafe.Offsetof(t.B))
    fmt.Println("....................")
    fmt.Println("字段C内存:", unsafe.Sizeof(t.C))
    fmt.Println("字段C偏移:", unsafe.Offsetof(t.C))

输出

变量内存: 12
....................
字段A内存: 1
字段A偏移: 0
....................
字段B内存: 4
字段B偏移: 4
....................
字段C内存: 1
字段C偏移: 8

优化

置换B与C的位置,让A的剩余空间能够放下C

type Tes struct {
    A bool
    C bool
    B uint32
}

输出:

变量内存: 8
....................
字段A内存: 1
字段A偏移: 0
....................
字段B内存: 4
字段B偏移: 4
....................
字段C内存: 1
字段C偏移: 1
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,407评论 0 6
  • 原理 关于Golang同一struct中field的书写顺序不同内存分配大小也会不同。主要原因如下:struct内...
    sipt阅读 1,482评论 0 1
  • 最全的iOS面试题及答案 iOS面试小贴士 ———————————————回答好下面的足够了-----------...
    zweic阅读 2,732评论 0 73
  • 前 言 从实践中看,Golang(以下简称Go)应用程序比Java占用更少的内存,这与它们的运行时环境有关,其运行...
    安静的少女阅读 1,681评论 0 5
  • 一些忿忿不平在內心翻滾著,被人們的立場反抗著,他們是在反對我嗎,他們是除我以外的所有人?他們是在對立面嗎?我想,不...
    MGNBQ阅读 133评论 0 0