在结构上使用 MemoryLayout 会给出不正确的大小
Using MemoryLayout on a struct gives the incorrect size
尝试查找结构的大小时,内存布局的行为有点奇怪。
我可以只维护一个添加每个大小的函数。但是我想知道有没有更好的方法。
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
您不能依靠简单地将结构的各个字段的大小相加来获得结构的大小。
Swift 可以在结构的字段中添加填充以对齐各个字节边界上的字段,以提高运行时访问数据的效率。
如果你想分配一个项目,你可以简单地使用内存布局的size
。如果你想要 n 个实例的连续块,那么你应该根据布局的 stride
分配块。
尝试查找结构的大小时,内存布局的行为有点奇怪。
我可以只维护一个添加每个大小的函数。但是我想知道有没有更好的方法。
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
您不能依靠简单地将结构的各个字段的大小相加来获得结构的大小。
Swift 可以在结构的字段中添加填充以对齐各个字节边界上的字段,以提高运行时访问数据的效率。
如果你想分配一个项目,你可以简单地使用内存布局的size
。如果你想要 n 个实例的连续块,那么你应该根据布局的 stride
分配块。