在Xcode中点击MemoryLayout进去可以看到里面的解释说明以及例子。
MemoryLayout 内存布局,描述其大小、步幅和对齐方式。
@frozen public enum MemoryLayout<T> {
//连续的内存占用量,以字节为单位
public static var size: Int { get }
//存储在连续存储器或存储器中的一个实例的开始到下一个实例的开始的字节数
public static var stride: Int { get }
//默认内存对齐方式,以字节为单位
public static var alignment: Int { get }
public static func size(ofValue value: T) -> Int
public static func stride(ofValue value: T) -> Int
public static func alignment(ofValue value: T) -> Int
//返回内联存储属性在类型的内存中的偏移量
//机器翻译:
/* 您可以使用此方法查找可以添加到类型为' T '的指针的字节距离,以获得指向' key '引用的属性的指针。只有当给定的键指向内联的、可直接寻址的内存中' T '表示的存储时,偏移量才可用。*/
public static func offset(of key: PartialKeyPath<T>) -> Int?
}
解释案例:
struct Point {
let x:Double
let y : Double
let isFilled : Bool
}
print(MemoryLayout<Point>.size) //17
print(MemoryLayout<Point>.stride) //24
print(MemoryLayout<Point>.alignment) //8
在分配内存或计算内存中实例之间的距离时,总是使用类型的“stride”的倍数,而不是“size”的倍数。这个例子为' Point '的四个实例分配了未初始化的原始内存空间。
let count = 4
let pointPointer = UnsafeMutableRawPointer.allocate(byteCount: count*MemoryLayout<Point>.stride, alignment: MemoryLayout<Point>.alignment)
普通内存
var age = 10
MemoryLayout<Int>.size // 10
MemoryLayout<Int>.stride // 8
MemoryLayout<Int>.alignment // 8
MemoryLayout.size(ofValue: age) // 8
枚举内存
不会存入枚举变量的内存中:
enum Session { // 这种是原始值(固定值) 不会存入枚举变量的内存中 原始值永远跟值绑定在一起,而且不允许在外部赋值
case spring,summer,autumn,winter
}
print(MemoryLayout<Session>.size) // 实际可能用到的空间大小 1
print(MemoryLayout<Session>.stride) // 分配占用的空间大小 1
print(MemoryLayout<Session>.alignment) // 对齐参数 1
关联值会被存入枚举变量的内存中:
enum Person { // 这种是关联值 关联值会被存入枚举变量的内存中
case attribute(Int,Int,Int,Int)
case other
}
let person = Person.attribute(11, 11, 11, 11)
print(MemoryLayout.size(ofValue: person)) // 33
print(MemoryLayout<Person>.size) //实际可能用到的空间大小 33
print(MemoryLayout<Person>.stride) // 分配占用的空间大小 40
print(MemoryLayout<Person>.alignment) // 对齐参数 8
enum Person { // 这种是关联值 关联值会被存入枚举变量的内存中
case attribute(Int,Int,Bool,Bool)
case other
}
let person = Person.attribute(11,11, true,true)
print(MemoryLayout.size(ofValue: person)) //18
print(MemoryLayout<Person>.size) //18
print(MemoryLayout<Person>.stride) //24
print(MemoryLayout<Person>.alignment) //8