美文网首页
苹果内存对齐原则

苹果内存对齐原则

作者: 我是晶锅 | 来源:发表于2019-03-05 21:24 被阅读0次

alloc主要创建流程

这里最重要的方法就是这三个:

  • cls->instanceSize
  • calloc
  • obj->initInstanceIsa


    image.png
1、cls->instanceSize

我们要知道,一个对象的创建是需要开辟内存空间的,所以这个方法就是给我们内存开辟空间,以达到创建内存的目的。

2、calloc

这个方法就是根据类的属性,成员变量等创建这个类的实例对象了。

3、obj->initInstanceIsa

我们知道每一个对象都是存在一个isa指针的,这个指针指向这个类的元类,元类的isa指向根元类,根元类的isa指向NSObject。所以每一个类都存在这个isa指针,这个方法就是创建isa指针的。

对象内存对齐原则

首先我们创建一个类Person,给这个类添加了三个属性age,name和height。
给他们赋值:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    LGPerson *p = [LGPerson alloc];
    p.age  = 18;
    p.name = @"cooci";
    p.height = 185;
    NSLog(@"%zu",class_getInstanceSize([p class])); // 8 --- 16
    NSLog(@"%zu",malloc_size((__bridge const void *)(p))); // 16
    // 系统 内存对齐 --- ISA 8 age 4 (int 剩 4) name(8)
    // 8  算法
    // 16 优化
    // 对象内存分配
    // isa -- age -- height -- name  : 8 + 4 + 4 + 8 = 24 ---- 32
    // isa -- age -- name -- height  : 8 + 8 + 8 + 8 = 32 ---- 32

}

通过测试打印得知:

  • isa是一个指针,占8字节
  • age和height是int类型,占4个字节
  • name是字符串指针,占8个字节

总共占用内存字节数:8+4+4+8=24;
但是系统分配内存在arm64下是16字节对齐的,所以会进去位移操作,最终这个对象占用了内存32个字节。也就是大于24的最小16的倍数。


image.png

内存位移技巧

创建对象,分配内存的时候是8字节对齐的。
比如person中的age是4个字节,如果后面跟着的是name为八个字节,要保证内存8字节对齐,那么age后面会跟着空出4字节来,让name从下一个8字节位置开始。
这样的好处是方便读取,不容易出错,也为了效率。
同样的,当对象创建完成的时候,系统分配内存也是保证16字节对齐的。
那么8字节和16字节是怎样完成的呢?

加入当前字节数为a:
8字节对齐:a + 7 << 3 >> 3。如果 a==5,那么结果为16
16字节对齐:a + 15 << 4 >> 4。如果a==5,那么结果为32

相关文章

  • 苹果内存对齐原则

    alloc主要创建流程 这里最重要的方法就是这三个: cls->instanceSize calloc obj->...

  • 内存对齐原则

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

  • iOS底层探索-calloc

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

  • iOS 内存对齐

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

  • iOS内存对齐原则

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

  • 内存对齐的原则

    1、数据成员对齐规则:结构(struct)或union的数据成员,第一个数据的成员,放在offset为0 的地方,...

  • iOS结构体内存对齐原则初探

    为什么OC对象在开辟内存的时候会有内存对齐原则,在对象申请内存的时候是16字节对齐的,在真正开辟所需要的内存时时8...

  • 手撕 iOS 底层04 -- 内存对齐原理

    本章主要由结构体内存对齐到苹果的属性重排, 以及16字节对齐算法 0x00 -- 获取内存大小的三种方式 获取内存...

  • 2.iOS底层学习之内存对齐

    学习了内存对齐之后的疑问?? 1.为啥要内存对齐?2.内存对齐的规则?3.内存对齐实例分析。 内存对齐的目的 上网...

  • 结构体内存对齐

    不同数据类型占用字节图 内存对齐的原则 1、数据成员对齐规则: 结构(struct)(或联合(union)的)数据...

网友评论

      本文标题:苹果内存对齐原则

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