专注iOS开发的小渣渣

OC底层探索05-内存对齐

2020-09-12  本文已影响0人  Henry________
上篇对对象实际内存占用和内存分配计算做了解释,但是留了一个小坑:对象属性的大小计算。

众所周知对象最终是以结构体的形式存在,所以通过对结构体的大小的探索来延伸到对象.

内存对齐

普通结构体,例1:

struct HRStruct {
    int c;  //4
    double a;   //8
    char b; //1
    char d;    //1
}HRStruct;

NSLog(@"HRStruct结构体大小: %lu",sizeof(HRStruct));

以下是输出结果:


为什么会这样呢,带着问题我们继续。

普通结构体,例2

struct HRStruct {
    double a;   //8
    int c;  //4
    char b; //1
    char d;    //1
}HRStruct;

仔细观察这个结构体中的变量是相同的,不同的只是顺序.
以下是输出结果:


得出一个结论:根据顺序不同也会造成所占内存大小不同,可是为什么会这样呢?我们继续。

结构体嵌套,例3

struct HRStruct {
    double a;   //8
    int c;  //4
    char b; //1
    char d;    //1
}HRStruct;

struct HRStruct2 {
    double a;   //8
    int c;  //4
    char b; //1
    struct HRStruct str;    // 16
}HRStruct2;

以下是输出结果:


内存的计算并不是简单的加法,而是做了一定的调整.

内存对齐原则

内存的计算是按照以下规则:

例子验证

各种类型大小,方便计算时查看
例1:
struct HRStruct {
    int c;  //4
    double a;   //8
    char b; //1
    char d;    //1
}HRStruct;
例2:
struct HRStruct {
    double a;   //8
    int c;  //4
    char b; //1
    char d;    //1
}HRStruct;
例3:
struct HRStruct {
    double a;   //8
    int c;  //4
    char b; //1
    char d;    //1
}HRStruct;

struct HRStruct2 {
    double a;   //8
    int c;  //4
    char b; //1
    struct HRStruct str;    // 16
}HRStruct2;

内存优化(属性重排)

通过例1、例2的对比,我们得出一个结论:根据顺序不同也会造成所占内存大小不同。所以通过调整的成员顺序可以优化内存大小、优化内存的布局,从而提高内存的读取效率.

我们能想到这个点,苹果的开发工程师一定也想到了这个点。

我们通过一个对象的内存情况来验证一下我们的猜测:

@interface HRTest : NSObject
        @property(nonatomic, copy)NSString *name;
        @property(nonatomic, copy)NSString *hobby;
        @property(nonatomic, assign)double height;
        @property(nonatomic, assign)char a;
        @property(nonatomic, assign)char ab;
@end

        HRTest * t = [HRTest alloc];
        t.name = @"Henry";
        t.hobby = @"woman";
        t.height = 180.0;
        t.a = 'a';
        t.ab = 'A';

打印结果:


第一个指针:isa指针
第二个指针:短类型重排

直接打印是乱码,但是仔细看还是有一点线索的。

结构体是不进行属性重排的,只有对象才会进行属性重排

第五个指针:double类型

apple对double,float进行了优化并不是直接存储。

验证一下:


总结

apple通过内存对齐将对象的内存进行了极致的压榨,这一点提现在很多地方,真的值得我们学习。

上一篇下一篇

猜你喜欢

热点阅读