美文网首页
iOS OC对象内存大小问题

iOS OC对象内存大小问题

作者: money_ac9e | 来源:发表于2021-03-17 14:41 被阅读0次

    问题:一个NSObject占几个字节

    系统分配了16个字节给NSObject对象(通过malloc_size函数获得)
    但NSObject对象内部只使用了8个字节的空间(64bit环境下,可以通过class_getInstanceSize函数获得)

    NSObject *obj = [[NSObject alloc] init];
            
    NSLog(@"%zd",malloc_size((__bridge const void *)obj));//#import <malloc/malloc.h>
    NSLog(@"%zd",class_getInstanceSize([obj class]));//#import <objc/runtime.h>
    
    输出结果:
    2021-03-17 14:31:50.659425+0800 01-oc原理[67315:1222590] 实际分配的内存大小:16
    2021-03-17 14:31:50.659880+0800 01-oc原理[67315:1222590] 实际需要的内存大小:8
    

    为什么实际需要8个,分配了16个呢?根据objc4的源代码来找到答案,所有的方法都掉用了instanceSize方法,方法规定最少为16个字节

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

    系统给实际需要的内存大小,涉及到了结构体成员变量的内存对齐的问题,结构体内存对齐其中有一条要求结构体大小需要是最大成员变量大小的整数倍

    系统给对象实际分配的内存大小,我们需要查看相关的资料和Apple的关于malloc的开源代码才能弄清楚其中的原因。具体原因是Apple系统中的malloc函数分配内存空间时,内存是根据一个bucket的大小来分配的。bucket的大小是16,32,48,64,80 ...,可以看出系统是按16的倍数来分配对象的内存大小的。

    OC语言源代码:https://www.cnblogs.com/feng9exe/p/7019570.html

    参考:https://www.jianshu.com/p/9839c7306d17

    相关文章

      网友评论

          本文标题:iOS OC对象内存大小问题

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