Go 字节对齐的问题?

2018-08-24 15:26:31 +08:00
 Lighfer

最近在拜读 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 个字节的内存。

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

1796 次点击
所在节点    问与答
4 条回复
icexin
2018-08-24 15:45:22 +08:00
注释不是说了嘛,为了让 Stats 字段对齐。
看一下 sync/atomic 的文档 https://godoc.org/sync/atomic#pkg-note-bug
在 32 位平台下,原子操作会出问题,需要用户手动对齐。
Lighfer
2018-08-24 16:00:19 +08:00
@icexin 注释我是看明白了是为了让 Stats 对齐,但是不明白的地方是为什么非要让它对齐,如果不对齐的话不是可以更加节省内存吗? 看了你贴的链接就明白了,十分感谢解答!!
sujin190
2018-08-25 11:30:48 +08:00
stats 有并发的原子操作的吧,是不是为了防止伪共享的问题吧,再说浪费这点空间算啥问题
Lighfer
2018-08-25 22:55:45 +08:00
@sujin190 是的,有 64 位的原子操作。之所以要强制对齐,原因是在 32 位平台下进行 64 位原子操作要求必须 8 字节对齐,否则程序会崩溃。这个在 1 楼贴出的文档里描述了,实际测试起来也确实是这样。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/482901

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX