Swift - MemoryLayout

2,267 阅读2分钟

前言:

在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的属性的内存,第一个可以获取任意类型属性的内存。