V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Lighfer
V2EX  ›  问与答

Go 字节对齐的问题?

  •  
  •   Lighfer · 2018-08-24 15:26:31 +08:00 · 1816 次点击
    这是一个创建于 2302 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在拜读 groupcache 的源码,读到这里就搞不懂了

        type Group struct {
            name       string
            getter     Getter
            peersOnce  sync.Once
            peers      PeerPicker
            cacheBytes int64 // limit for sum of mainCache and hotCache size
            mainCache cache
            hotCache cache
            loadGroup flightGroup
    
            _ int32 // force Stats to be 8-byte aligned on 32-bit platforms
            
            Stats Stats
        }
    

    为什么倒二个字段要加上_ int32, 注释给的是强制 8 字节对齐, 但是为什么要这么做?如果不加上这个地段的话,在 32 位系统上可以节约 4 个字节的内存,在 64 位系统上可以节约 8 个字节的内存。

    有没有大佬给解答一下?十分感谢!

    4 条回复    2018-08-25 22:55:45 +08:00
    icexin
        1
    icexin  
       2018-08-24 15:45:22 +08:00
    注释不是说了嘛,为了让 Stats 字段对齐。
    看一下 sync/atomic 的文档 https://godoc.org/sync/atomic#pkg-note-bug
    在 32 位平台下,原子操作会出问题,需要用户手动对齐。
    Lighfer
        2
    Lighfer  
    OP
       2018-08-24 16:00:19 +08:00
    @icexin 注释我是看明白了是为了让 Stats 对齐,但是不明白的地方是为什么非要让它对齐,如果不对齐的话不是可以更加节省内存吗? 看了你贴的链接就明白了,十分感谢解答!!
    sujin190
        3
    sujin190  
       2018-08-25 11:30:48 +08:00 via Android
    stats 有并发的原子操作的吧,是不是为了防止伪共享的问题吧,再说浪费这点空间算啥问题
    Lighfer
        4
    Lighfer  
    OP
       2018-08-25 22:55:45 +08:00
    @sujin190 是的,有 64 位的原子操作。之所以要强制对齐,原因是在 32 位平台下进行 64 位原子操作要求必须 8 字节对齐,否则程序会崩溃。这个在 1 楼贴出的文档里描述了,实际测试起来也确实是这样。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1216 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 17:40 · PVG 01:40 · LAX 09:40 · JFK 12:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.