在结构上使用 MemoryLayout 会给出不正确的大小

Posted

技术标签:

【中文标题】在结构上使用 MemoryLayout 会给出不正确的大小【英文标题】:Using MemoryLayout on a struct gives the incorrect size 【发布时间】:2021-12-16 15:08:37 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

我可以接受字节对齐会使大小变大。但是您知道什么优化会使尺寸变小吗? 仅供参考:添加案例会将大小增加到 6。 Mode 只能有一个值,因此根本没有必要存储它。当您添加第二个案例时,它会扩展到 UInt8 并且可能会将其填充。 对。那么为什么当我添加更多案例时它会变成 6 个字节呢?字节对齐? 这是我的猜测(这就是我所说的“可能会填充它”)。

以上是关于在结构上使用 MemoryLayout 会给出不正确的大小的主要内容,如果未能解决你的问题,请参考以下文章

win7不正常开关机,系统恢复选项

百家号已经发了的图片摆不正怎么办

Swift学习笔记之---字符类型

Swift学习笔记之---字符类型

一般服务器运行不正常有哪些因数引起

arcmap构建金字塔影像颜色不正