iOS之底层内存对齐

2021-06-16  本文已影响0人  无极战思

引言

内存对齐是内存里面一个很重要的词汇,可是大部分开发者对这个词汇的含义都是一知半解。

 WJPerson*wj = [WJPerson alloc];
wj.name = @"无极";
wj.age = 30;
NSLog(@"对象类型的内存大小:%lu",sizeof(wj));
NSLog(@"对象实际的内存大小:%lu",class_getInstanceSize([wj class]));
NSLog(@"对象分配的内存大小:%lu",malloc_size((__bridge const void *)(wj)));
NSLog(@"-----------------------------------------");

WJPerson*wj2;
NSLog(@"对象类型的内存大小:%lu",sizeof(wj2));
NSLog(@"对象实际的内存大小:%lu",class_getInstanceSize([wj2 class]));
NSLog(@"对象分配的内存大小:%lu",malloc_size((__bridge const void *)(wj2)));

输出结果:

2021-06-16 13:12:08.712404+0800 内存对齐[3440:72350] 对象类型的内存大小:8
2021-06-16 13:12:08.712537+0800 内存对齐[3440:72350] 对象实际的内存大小:24
2021-06-16 13:12:08.712659+0800 内存对齐[3440:72350] 对象分配的内存大小:32
2021-06-16 13:12:08.712746+0800 内存对齐[3440:72350] -----------------------------------------
2021-06-16 13:12:08.712831+0800 内存对齐      [3440:72350] 对象类型的内存大小:8
2021-06-16 13:12:08.712923+0800 内存对齐[3440:72350] 对象实际的内存大小:0
2021-06-16 13:12:08.713007+0800 内存对齐[3440:72350] 对象分配的内存大小:0

结果分析:

问题:class_getInstanceSizemalloc_size 底层做了什么?我们如何知道class_getInstanceSize8字节对齐,而malloc_size16字节对齐?

在研究后面重点之前,我们先来看下基本数据类型在arm64环境下占用的内存大小。

基本数据类型所占字节数.gif

下面解释为什么计算机会有内存对齐的概念,出于什么目的要内存对齐。

内存对齐规则:

数据成员对齐规则:结构体(struct)(或联合体(union))的数据成员,第一个数据成员放在offset为0的地方(即首地址的位置),以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int4字节),则要从4的整数倍地址开始存储。
结构体作为成员变量:如果一个结构体里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍开始存储(struct a里有struct b,b里有char,int,double等元素,那b应该从8(doudle为8 )整数倍开始存储)

下面我们先来看一个例子:


struct内存.gif
struct WJPerson1{
double a;       
char b;       
int c;          
short d;
}myPerson1;
struct WJPerson2
{
double b;
int c;
char a;
short d;
}myPerson2;
NSLog(@"%lu-%lu",sizeof(myPerson1),sizeof(myPerson2));

输出结果:

 2021-06-16 16:13:21.621334+0800 内存对齐[4074:158189] 24-16

从上面我们可以看出,myPerson1myPerson2两个结构体里面元素是一样的,只是顺序不同,内存大小却不一样,为什么?这就是结构体内存对齐。

具体分析如下:[p,q] p表示当前开始的位置,q表示大小
myPerson1:

myPerson2:

下面这个是嵌套的结构体
struct WJPerson3 {
double a;
int b;
char c;
short d;
int e;
struct WJPerson1 str;
} myPerson3;


struct嵌套内存.gif

myPerson3具体分析如下:

上一篇 下一篇

猜你喜欢

热点阅读