一: 我们在了解结构体内存对齐之前先看下下面两个简单的知识点
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;
运行输出结果 如图
下面我们来分析一下:
有点匆忙,如有错误请提出,谢谢!