前言:
在Swift中使用MemoryLayout获取数据类型、属性的内存情况。
1.数据类型
Swift中数据类型主要分为值类型与引用类型;
1.1 值类型(Value type):包括结构体和枚举 结构体包括:Bool、Int、Float、Double、Character、String、Array、Dictionary、Set。
枚举包括:Optional。 1.2 引用类型(reference type):类(Class)
2.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 //获取属性的内存对齐系数
}
3.主要使用方式
3.1获取数据类型、类的内存大小
MemoryLayout<T>.size<br>
MemoryLayout<T>.stride<br>
MemoryLayout<T>.alignment<br>
3.2获取属性的内存大小
> MemoryLayout<T>.size(ofValue value:T><br>
> MemoryLayout<T>.stride(ofValue value:T><br>
> MemoryLayout<T>.alignment(ofValue value:T><br>
获取内存的🌰:
enum Direction{
case north
case south
case west
case east
}
//获取枚举Direction的内存大小
MemoryLayout<Direction>.size //打印结果:1
MemoryLayout<Direction>.stride //打印结果:1
MemoryLayout<Direction>.alignment// 打印结果:1
//获取属性direct的内存大小
var direct = Direction.west
print(MemoryLayout.size(ofValue: direct))//打印结果:1
print(MemoryLayout.stride(ofValue: direct))//打印结果:1
print(MemoryLayout.alignment(ofValue: direct))//打印结果1
获取属性direct的内存还可以使用:
MemoryLayout<Direction>.size(ofValue: direct)//打印结果:1
MemoryLayout<Direction>.stride(ofValue: direct)//打印结果:1
MemoryLayout<Direction>.alignment(ofValue: direct)//打印结果:1
两者的区别在于:第二个只能获取类型为Direction的属性的内存,第一个可以获取任意类型属性的内存。