美文网首页
alloc底层原理分析-02 申请内存 字节对齐

alloc底层原理分析-02 申请内存 字节对齐

作者: 扫地僧练级 | 来源:发表于2021-01-13 13:44 被阅读0次

    接着上一篇说:

    思考对象需要开辟多少内存空间?(存放成员属性 本身有NSObject的)
    断点一步一步进入:

    image.png

    让没有字节对齐的让字节对齐

    image.png

    uint32_t unalignedInstanceSize() const {
            ASSERT(isRealized());
            return data()->ro()->instanceSize;
        }
    

    data()->ro() dyld映射文件加载的时候加载的是data数据段,有一个ro属性,这个是类对象的属性

    image.png

    8字节对齐

    word_align这个算法就是8字节对齐的算法,因为指针的大小是8字节,所以这个算法返回8的倍数(对象内存空间是8的倍数 - 8字节对齐

    // 8 + 7 == 15
    // 0000 1000 8
    // 0000 0111 7
    // 0000 1111 15
    // 1111 1000 ~7
    // 0000 1000 15 & 7 = 8
    // 任何一个数先保证能至少升到8(0000 1xxxx),剩下的x都抹掉(升对齐)

    验证:对象属性在内存中的布局

    方式1

    lldb

    @interface Person : NSObject
    
    @property (nonatomic) NSString *sex;
    @property (nonatomic) NSInteger age;
    @property (nonatomic) long height;
    
    @end
    
    Person *p = [[Person alloc] init];
    p.age = 18;
    p.sex = @"男";
    p.height = 198.0f;
    
    image.png

    解释一下:
    0x10072bca0:起始的isa
    iOS:小端,倒着读
    x/4xg:读四段
    第一个是isa:0x001d800100002295
    第二个是sex:0x0000000100001030
    第三个是age:0x0000000000000012
    第四个是height:0x00000000000000c6

    方式2

    查看整个内存


    image.png image.png

    现在回答一下之前的问题,看源码:

     size_t size = alignedInstanceSize() + extraBytes;
            // CF requires all objects be at least 16 bytes.
            if (size < 16) size = 16;
            return size;
    

    可以看到至少开辟了16字节(为了安全,防止越界)

    init方法做了什么呢?

    - (id)init {
        return _objc_rootInit(self);
    }
    
    _objc_rootInit(id obj)
    {
        // In practice, it will be hard to rely on this function.
        // Many classes do not properly chain -init calls.
        return obj;
    }
    
    

    什么都没有做(给我们留一个口子 重写)

    相关文章

      网友评论

          本文标题:alloc底层原理分析-02 申请内存 字节对齐

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