iOS 内存字节对齐计算方式

字节对齐有三原则:

1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。

2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.

例子

struct StructOne {
    char a;         //1字节 规则1[0]
    double b;       //8字节 规则2[8-15]
    int c;          //4字节 规则2[16-19]
    short d;        //2字节 规则2[20-22]  规则3补齐[23]
} MyStruct1;

struct StructTwo {
    double b;       //8字节 规则1[0-7]
    char a;         //1字节 规则1[8]
    int c;          //4字节 规则1[12-15]
    short d;        //2字节 规则1[16-17]    规则3补齐[18-23]
} MyStruct2;

struct StructThree {
    double b;       //8字节 规则1[0-7]
    char a;         //1字节 规则1[8] 
    short d;        //2字节 规则1[10-11]
    int c;          //4字节 规则1[12-15]
} MyStruct3;

struct StructFour {
    double b;        //8字节 规则1[0-7]
    char a;          //1字节 规则1[8]
    short d;         //2字节 规则1[10-11]
    struct StructThree c;//16字节 规则2[16-31]
} MyStruct4;

NSLog(@"%lu---%lu--%lu--%lu", sizeof(MyStruct1), sizeof(MyStruct2), sizeof(MyStruct3), sizeof(MyStruct4));

打印结果: 24---24--16--32

参考资料
快速弄懂内存字节对齐
iOS 内存字节对齐

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • @[c++|struct] 今天在编程中碰到一个坑,搞的调试了半天,最后发现程序中在写数据和读取数据时结构体定义不...
    drybeans阅读 3,640评论 1 11
  • 源网址[英文] github上有大神翻译了一篇内存对齐的英文文献,我复现了一下过程; 发现其中有个地方有出入(st...
    十曰立阅读 1,207评论 0 3
  • 通过一段代码来描述内存对齐的现象。 上述代码打印出来的结果为:24,16 为什么相同的结构体,只是交换了变量 ab...
    豆瓣菜阅读 6,847评论 5 26
  • 为什么字节对齐: 体系结构的对齐和不对齐,是在时间和空间上的一个权衡。对齐节省了时间。假设一个体系结构的字长为w,...
    和女神经常玩阅读 363评论 0 0
  • unsafe 包简单说明 unsafe,顾名思义,是不安全的,Go定义这个包名也是这个意思,让我们尽可能的不要使用...
    Gopherzhang阅读 1,553评论 8 3