首页 > 解决方案 > 在结构上使用 MemoryLayout 会给出不正确的大小

问题描述

尝试查找结构的大小时,内存布局的行为有点奇怪。

我可以只维护一个增加每个大小的函数。但我想知道是否有更好的方法。

enum Mode: UInt8 {
    case tings
}

// this should be 5 - UInt8 + UInt16 + UInt16
struct Stuff {
    let mode: Mode
    let sessionID: UInt16
    let sessionCount: UInt16
}
print(MemoryLayout<Stuff>.size)                 // 4 ???
print(MemoryLayout<UInt16>.size)                // 2
print(MemoryLayout<Mode>.size)                  // 0 !?!?!?!?
print(MemoryLayout<Mode.RawValue>.size)         // 1

标签: swiftstructmemory-layout

解决方案


您不能依靠简单地将结构的各个字段的大小相加来获得结构的大小。

Swift 可以在 struct 的字段中添加填充,以对齐各个字节边界上的字段,从而提高运行时访问数据的效率。

如果你想分配一项,你可以简单地使用size内存布局。如果您想要一个包含 n 个实例的连续块,那么您应该根据stride布局分配块。


推荐阅读