iOS开发-内存字节对齐原理

本文详细探讨了iOS开发中的内存字节对齐现象、规则、原理及实践,解释了为何编译器进行内存对齐以及其对性能的影响。通过实例展示了内存对齐如何影响结构体大小,并提出了不同的内存字节对齐算法。
摘要由CSDN通过智能技术生成

内存字节对齐现象

我们首先通过两个结构体来观察iOS的内存字节对齐的现象。

typedef struct StructOne {
   
    char a;         //1字节
    double b;       //8字节
    int c;          //4字节
    short d;        //2字节
} MyStructOne;

typedef struct StructTwo {
   
    double b;       //8字节
    int c;          //4字节
    short d;        //2字节
    char a;         //1字节
} MyStructTwo;

NSLog(@"MyStructOne:%lu", sizeof(MyStructOne));
NSLog(@"MyStructTwo:%lu", sizeof(MyStructTwo));

上述代码打印出来的结果为:

MyStructOne:24
MyStructTwo:16

为什么定义相同的结构体,交换了变量在结构体中的顺序,结构体的内存大小就改变了呢?这就是iOS中“内存字节对齐”的现象。

内存字节对齐规则

每个特定平台上的编译器都有自己的默认“对齐系数”。可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来指定对齐系数,其中的n就是“对齐系数”,也是需要对齐的字节数。

在了解为什么要进行内存字节对齐之前,我们先来看看内存字节对齐的规则:

①数据成员对齐规则:结构体每个数据成员相对结构体的首地址的偏移量都是“对齐系数”的整数倍,如不满足,对数据成员进行填充字节以满足。可以使用后面的数据成员进行字节填充。

②结构体对齐规则:结构体的首地址是“对齐系数”的整数倍,结构体的总大小也是“对齐系数”的整数倍,如不满足,最后填充字节以满足。

验证字节对齐规则:

Xcode中默认为#pragma pack(8),也就是8字节对齐。如果在设置为#pragma pack(1) 就代表不进行内存对齐,之前两个结构体的内存大小就都是16了。

MyStructOne的进行内存字节对齐后的结构体为:

// Shows the actual memory layout
struct StructOne {
   
    char a;        // 1 字节
    char _pad0[7]; //占位char[]用于补齐7字节以满足8的整数倍(条件1)
    double b;      // 8 字节,因为double能占满8字节,所以无法使用double追加在char后面来补齐
    int c;         // 4 字节
    short d;       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值