swift - 在结构上使用 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
解决方案
您不能依靠简单地将结构的各个字段的大小相加来获得结构的大小。
Swift 可以在 struct 的字段中添加填充,以对齐各个字节边界上的字段,从而提高运行时访问数据的效率。
如果你想分配一项,你可以简单地使用size
内存布局。如果您想要一个包含 n 个实例的连续块,那么您应该根据stride
布局分配块。
推荐阅读
- firefox - 从 Firefox WebExtension 注册 PAC 代理文件 - 未定义函数
- php - PHP 警告:include_once()
- django - django 上下文找不到在模板标签中使用时存在的值
- javascript - 在提交 asp.net core 2.0 之前验证表单
- android - 垂直搜索栏在 API25 上变为透明-
- d - 在解析文件之前如何跳过文件的 BOM?
- python - .get() python json 文件 discord bot
- php - 在数字之间放置 +、- 或什么都没有的所有可能性,以获得等于 100 的总和
- javascript - 如何使用 jquery 验证动态填充的表单字段?
- python - 在 python 中的 numpy linspace 上使用函数