iOS底层探究-05:内存对齐

2020-09-09  本文已影响0人  对你的微笑纯属礼貌_e31

获取内存大小的三种方式

sizeof

class_getInstanceSize

这个方法在iOS底层探究-03:alloc & init & new 源码分析分析时就已经分析了,是runtime提供的api,用于获取类的实例对象所占用的内存大小,并返回具体的字节数,其本质就是获取实例对象中成员变量的内存大小

malloc_size

这个函数是获取系统实际分配的内存大小

通过以下代码验证一下:



以下是打印结果:


总结

结构体内存对齐

我们定义两个结构体,分别计算他们的内存大小,以此来探究内存对齐原理

struct Person {
    double a;   // 8
    char b;     // 1
    int c;      // 4
    short d;    // 2
} person;

struct Bus {
    double a;   // 8
    int b;      // 4
    char c;     // 1
    short d;    // 2
} bus;

NSLog(@"%lu-%lu",sizeof(person),sizeof(bus));

以下是输出结果:


从打印结果我们可以看出一个问题,两个结构体乍一看,没什么区别,其中定义的变量 和 变量类型都是一致的,唯一的区别只是在于定义变量的顺序不一致,那为什么他们做占用的内存大小不相等呢?其实这就是iOS中的内存字节对齐现象
内存对齐原则有以下三点:

验证对齐规则

下表是各种数据类型在ios中的占用内存大小,根据对应类型来计算结构体中内存大小


结构体 Person 内存大小计算

根据内存对齐规则计算Person的内存大小,详解过程如下:

结构体 Bus 内存大小计算

根据内存对齐规则计算Bus的内存大小,详解过程如下:

结构体嵌套结构体

在定义一个结构体PersonBus,在PersonBus中嵌套Bus,如下所示

struct PersonBus {
    double a;   // 8
    char b;     // 1
    int c;      // 4
    short d;    // 2
    struct Bus bus1;
} personBus;

NSLog(@"%lu-%lu",sizeof(personBus),sizeof(personBus.bus1));

打印结果如下:



分析 PersonBus 的内存计算

上一篇下一篇

猜你喜欢

热点阅读