美文网首页
结构体内存对齐

结构体内存对齐

作者: 20cce19871e2 | 来源:发表于2021-06-08 23:49 被阅读0次

一:  我们在了解结构体内存对齐之前先看下下面两个简单的知识点

1 :oc类型在32位和64位占的字节,如图

2  :内存对齐原则

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

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

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

二:接下来我们看下内存大小的影响

1 、首先我们先自己创建一个项目,定义一个SS_Person类,里面声明一些属性如图:

运行项目打印如图

2、我们现在注释几个属性,只剩下name属性 

运行 如图结果 变成了16 

3、现在我们在给SS_Person加一个成员变量 

然后运行 会发现打印结果变成了24

4、现在我们给SS_Person加一个方法

然后运行打印 发现结果没有变 如图

`然后我们可以总结一下 得出结论:

属性和成员变量影响内存大小,方法不影响内存大小!`

三 、下面我们来一起看一下结构体对齐原则

1、我们先来一个例子,定义两个结构体,如图

打印输出解放如下 

我们会发现,结构体定义是一样的,唯一不同就顺序不同,导致了输出结果就不同了;

这是问什么呢 ?

根据上面的对齐规则,ss_struct1总结如下图 :

描述:根据内存对齐原,第一个成员从0的位置开始存储,double占8字节从0-7这8个位置;char是1个字节,8正好是1倍数,占8位置占;int类型大小为4个字节,9 、10、11都不是4的倍数,12是4的倍数所以从第12的位置开始存储 12、13、14、15四个位置,short是占2个字节,且是16能整除,所以占用16、17两个位置,再根据结构体的大小应该是能被最大的类型字节的大小整除,即被8整除,需要补位到24,可以得出ss_struct1的大小为24

同理:我们也可以得出ss_struct2的大小就是16,如图:

问题:为什么ss_struct1中不存储9 10 11呢?

空间换取时间,内存更加优化!

2、我们再看下下面代码

struct SS_Struct1 {

    double a;

    char  b;

    int    c;

    short  d;

}ss_struct1;

struct SS_Struct2 {

    double a;

    int    c;

    char  b;

    short  d;

    struct SS_Struct1 struct1;

}ss_struct2;

运行输出结果 如图

下面我们来分析一下:

有点匆忙,如有错误请提出,谢谢!

相关文章

  • 结构体

    1.结构体 2.结构体的内存对齐模式 编译器在编译一个结构的时候采用内存对齐模式,结构体总是以最大的成员最为对齐单...

  • ndk-基础知识

    数组和指针,数组指针,指针数组 结构体 内存对齐 内存对齐 结构体大小 S5DUD10BN083MHEJEX7TP...

  • 内存对齐详解

    1、什么是内存对齐假设我们声明两个变量: 2、结构体内存对齐规则 结构体所占用的内存与其成员在结构体中的声明顺序有...

  • iOS原理探索02-- 内存对齐

    结构体内存对齐 我们首先定义两个结构体,分别计算他们的内存大小,并讨论内存对齐原理 从两个结构体来看两者没啥大的区...

  • iOS 内存对齐

    一、结构体内存对齐 1.1 结构体内存对齐三大原则 数据成员对⻬规则结构体(struct)或联合体(union)的...

  • 从结构体内存对齐到OC对象内存对齐

    1、结构体内存对齐 结构体对齐规则:1:数据成员对⻬规则:结构(struct)(或联合(union))的数据成员,...

  • iOS 内存对齐:结构体继承和结构体作为另一个结构体成员变量情况

    内存对齐规则就不赘述了,这里讨论下继承和结构体作为另一个结构体成员变量的情况下,结构体内如何进行内存对齐。以下测试...

  • 结构体

    结构体有名定义 无名定义 结构体嵌套定义 结构体内存对齐 结构体成员初始化 结构体变量引用 结构体的有名定义:直白...

  • 第一天,内存对齐

    一对齐规则: 1.非结构体类型 32位 4字节对齐,64位 8字节对齐 2.结构体类型 以结构体中,最大内存的整数...

  • iOS 结构体内存对齐浅析

    什么是内存对齐 内存对齐是一种在计算机内存中排列数据、访问数据的一种方式。它包含基本数据对齐和结构体数据对齐 。 ...

网友评论

      本文标题:结构体内存对齐

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