zigcc/zig-course

关于内存布局的说法对新手可能存在误导

Closed this issue · 2 comments

不保证遵循某种顺序保证(不)遵循某种顺序 还是有区别的。目前能够保证的似乎只有各个字段会各自对齐。

目前的行文给人的感觉是“布局一定会变成这样”,并且隐约告诉读者“大家可以通过类似这样做实验的方法来验证某种行为”。这恐怕是在重蹈谭浩强的覆辙。

在 64 位系统上,Foo 的内存布局是:
```sh
| 4(i32) | 8(pointer) | 4(padding) |
```
如果去掉 packed,则是
```sh
| 8(pointer | 4(int32) | 4(padding) |
```
可以看到, Zig 会对字段进行重新排序。

根据此issue,ziglang/zig#20265 ,已经解释了编译器会尝试进行额外的填充令其符合16比特对齐
该部分要论证的仅仅是packed struct在保证声明顺序且进行压缩的情况下,在结构体尾部仍会存在部分填充
并非说结构会变成这样子,并且要说明struct会由编译器进行重新组合来表明“zig 并不保证结构体字段的顺序和结构体大小,但保证它是 ABI 对齐的。”
当然此处的确存在让人误会的情况,进行一些额外说明大概会好些

发起了一个新的pr,可以看一下是否可以解决该issue