内存对齐

2020-04-18  本文已影响0人  NapoleonY

概述

为了减少 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 可选类型是比较浪费内存的

参考

  1. Swift 对象内存模型探究(一)
上一篇 下一篇

猜你喜欢

热点阅读