概述
为了减少 CPU读取内存的次数,提升性能,CPU 会以8/16/32 字节等为单位(存取粒度)进行存取操作。
swift 中对应的工具类为MemoryLayout
MemoryLayout<T>.size // 所占内存大小
MemoryLayout<T>.alignment // 内存对齐系数
MemoryLayout<T>.stride // 数组中所占内存实际大小
struct 内存模型
struct Point {
var a: Bool
var b: Double
}
let pointSize = MemoryLayout<Point>.size // 16
let pointAligment = MemoryLayout<Point>.alignment // 8
let pointStride = MemoryLayout<Point>.stride // 16
拓展一
如果改下 Point 结构,size变为9,原因是上一个struct由于内存对齐,Bool有有7个byte填充
每个数据成员的偏移为(#pragma pack(指定的数n) 与 该数据成员的自身长度中较小那个数的整数倍,不够整数倍的补齐
struct Point {
var b: Double
var a: Bool
}
let pointSize = MemoryLayout<Point>.size // 9
let pointAligment = MemoryLayout<Point>.alignment // 8
let pointStride = MemoryLayout<Point>.stride // 16
拓展二
struct Point {
var a: Bool
var b: Double?
}
let pointSize = MemoryLayout<Point>.size // 17
let pointAligment = MemoryLayout<Point>.alignment // 8
let pointStride = MemoryLayout<Point>.stride // 24
如果为optional, size增加一个字节,但是由于对齐系数为8,因此还需7个byte补充,以内存对齐,因此共需要1 + 7 + 8 + 1 + 7共24个byte
备注:可以看出swift 可选类型是比较浪费内存的
网友评论