Swift
使用Swift
新方案:MemoryLayout
示例:
struct Point {
let x: Double
let y: Double
let isFilled: Bool
}
MemoryLayout<Point>.size == 17// 实际用到的空间大小
MemoryLayout<Point>.stride == 24//系统分配的空间大小
MemoryLayout<Point>.alignment == 8//对齐参数
在实际测试中,用MemoryLayout的方式计算对象时,只是返回对象的引用大小,或者说返回了指针占用的内存空间,导致返回的值总是8。
对于对象实际占用的内存空间,可以通过runtime的方法来获取。
class CustomClass {
let a: Int = 8
let b: String = "3"
let c: Bool = false
}
let a1 = MemoryLayout<CustomClass>.size // 8
let a2 = MemoryLayout<CustomClass>.stride // 8
let a3 = MemoryLayout<CustomClass>.alignment // 8
let a4 = class_getInstanceSize(CustomClass.self) // 48 (一个没有属性的类占用16,这个类的属性至少需要17个字节,所以需要的空间是33,开辟内存空间的一页是16,这里的48就相当于开辟了三页)
OC
OC 中我们常用的有三种方案:
sizeof
class_getInstanceSize
malloc_size
sizeof
sizeof方式 并不是一个方法调用,是一个编译器特性,在编译时期,就将类型的值计算出来,它表示的是一种数据类型的大小。比如在计算对象时,计算的就是该对象的指针所占用的内存空间大小
class_getInstanceSize
class_getInstanceSize 获取的是 对象实际占用的内存空间大小
malloc_size
OC 对象开辟的内存空间,malloc_size 是系统给对象分配的空间,calloc 在开辟空间时,采用的是 16字节对齐方式。