美文网首页iOS底层
iOS内存对齐原则

iOS内存对齐原则

作者: xxxxxxxx_123 | 来源:发表于2020-01-03 18:05 被阅读0次

内存对齐原则:

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

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

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

知道了原则之后,我们现在对这几个原则,逐步分析一下:

结构体分析

struct Struct1 {
    char a;             // 1
    double b;           // 8
    int c;              // 4
    short d;            // 2
} MS1;
struct Struct2 {
    double b;           // 8
    char a;             // 1
    short d;            // 2
    int c;              // 4
} MS2;
struct Struct3 {
    char a;             // 1
    struct Str2 ms2;    // 16
    short d;            // 2
    int c;              // 4
} MS3;

首先我们定义MS1、MS2、MS3这个三个结构体,然后我们来打印结构的size:

NSLog(@"%lu-%lu-%lu", sizeof(MS1), sizeof(MS2), sizeof(MS3));

得到的结果为 24-16-32。

image

根据上图我们可以知道每个结构体中元素所占字节大小,MS1中的a占1个字节、b占8个字节、c占4个字节、d占2个字节,很明显1+8+4+2 != 24,那为什么MS1的size是24呢?

根据内存对齐原则,a占1字节,b在内存进行占位的时候,由于在a中剩下的7个字节不够b使用,所以b会重新开辟8字节,此时a独占8字节,c接续排在b之后的8字节空间内,c的这块内存在放入c之后还剩余4字节,而d占用2字节,放入c的区域内。所以MS1占用空间为:

8(1)+ 8 + 8(4+2)= 24。
image

同理,我们可以得到

MS2: 8 + 8(1+2+4)= 16
MS3: 8(1) + 16 + 8(2+4) = 32

相关文章

  • iOS内存对齐原则

    内存对齐原则: 1、数据成员对⻬规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在o...

  • iOS 内存对齐原则分析

    在分析内存对齐原则之前,我们先来分析一下在OC和C中,各种基本数据类型在32位或64位的操作系统中,他们所占的字节...

  • iOS内存对齐

    这篇文章我们来探索一下iOS内存对齐的原理,在探索完内存对齐原理之后,你就会明白内存对齐的好处。 在讲述内存对齐时...

  • OC 对象的底层本质2

    因为内存对齐原则 ,内存大小必然是 8的倍数 所以是24个字节 iOS 分配OC对象内存都是16的倍数 所以mal...

  • iOS底层探究 - 内存对齐

    目录1:内存对齐的原因2:内存对齐的规则3:结构体内存分配演练以及在iOS中对象成员的内存分配探索 一 :内存对齐...

  • 内存对齐原则

    导引 首先看一个例子: 从图中看出,打印结果不同,这是为什么呢? 基础知识(arm64) char 1字节; s...

  • iOS-探索内存对齐原则

    前言 我们知道一个NSObject对象创建的时候系统分配了16个字节,实际使用的只有8个字节,可是里面要是添加了属...

  • iOS底层探索-calloc

    一、calloc底层探索 1.1、内存对齐原则 a:数据成员对齐规则:结构(struct)(或联合(union))...

  • iOS底层之内存对齐算法解析

    目前但凡一个iOS岗面试都会问个内存对齐问题,那么什么是字节对齐?成员变量对齐和对象内存对齐有什么区别?今天我来为...

  • iOS MRC 内存管理的基本原则

    iOS MRC 内存管理的基本原则iOS MRC 内存管理的基本原则

网友评论

    本文标题:iOS内存对齐原则

    本文链接:https://www.haomeiwen.com/subject/inctactx.html