iOS OC对象内存大小问题

2021-03-17  本文已影响0人  money_ac9e

问题:一个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

上一篇下一篇

猜你喜欢

热点阅读