第 84 期 2020-04-02 图解 Go 之内存对齐

YouTube

简介

关于内存对齐总会有各种声音?为什么要对齐,怎么对齐,不对齐有什么影响么?

这些声音可以离我们很远,也可以很近,比如:

  • 当你想弄明白WaitGroup.state1为什么是[3]uint32而不是[12]byte
  • 当你想知道struct是否占用内存是否合理
  • 当你不希望在32位系统上原子操作int64|uint64时发生panic
  • 当你闲着没事就是想读读源码提升下逼格。。。

本次分享借自己研究内存对齐的一些代码及源码示例,为大家带来Go里边的内存对齐是什么样的,以及如何利用内存对齐优化数据结构,提高代码的平台兼容性。

大纲

  • 了解内存对齐的收益
  • 为什么要对齐
  • 怎么对齐:
    • 数据结构对齐
    • 内存地址对齐
  • 64位字的安全访问保证(32位平台)

有个问题请教下:既然WaitGroup.state1由于原子操作进行内存对齐了。sync.Pool中的headTail也是64位,也有原子操作,为什么不考虑内存对齐呢?