【发布时间】:2015-03-06 11:56:39
【问题描述】:
具体来说,我只想知道为什么在我的 64 位 mac 上,Swift 编译器会说某些类型的对齐方式,如 Float80 是 16。
为了检查一个类型的内存对齐要求,我使用了alignof 函数。
sizeof(Float80) // ~> 16 bytes, it only needs 10 bytes, but because of hardware design decisions it has to be a power of 2
strideof(Float80) // ~> 16 bytes, clear because it is exact on a power of 2, struct types with Float80 in it, can be bigger
alignof(Float80) // ~> 16 bytes, why not 8 bytes, like String ?
我了解小于或等于单词大小的类型的内存对齐是有益的。
sizeof(String) // ~> 24 bytes, clear because 24 is multiple of 8
strideof(String) // ~> 24 bytes, clear because 24 is multiple of 8
alignof(String) // ~> 8 bytes, clear because something greater or equal to 8 bytes should align to 8 bytes
许多内存占用较大的类型,如String(大小为 24)确实有 8 个字节的内存对齐要求。我希望这是我正在使用的 CPU/RAM 总线的大小,因为我有一个 64 位的 mac 和操作系统。
我使用sizeof 函数检查没有最后填充的类型的大小,并使用strideof 函数在末尾添加填充(strideof 在结构数组中更有帮助,Swift 然后将字节添加到end 以达到对齐要求的下一个倍数。)
我了解小于或等于 8 字节大小的类型需要填充。
但我不明白为什么在我的 64 位 mac 上内存对齐要求大于 8 字节是有利的。
Float80 的值需要 80 位,即 10 个字节,其中 6 个填充字节。
我的意思是,为了更清楚,这是一张图片。 Float80 允许绿色位置,红色位置不允许。 在这张图中,内存是 8 个字节的块。
【问题讨论】:
-
您的图片似乎具有误导性。如果一行代表 8 个字节,则 Float80(包括填充)只能占用两行,而不是 16 行。如果一行代表 1 个字节,则第 3 列中的 Float80 不在对齐地址上。
-
@MartinR 你说的很对,换了图片
-
24 是 2 的精确幂??
-
@SlippD.Thompson 你是对的,那是一个错误。感谢您的提示。我纠正了它。 8 是字长,24 是 8 的倍数。