2 isa结构分析

103 阅读2分钟

2 isa结构分析

1、内存分布

类内存空间计算,isa 8 + 属性内存,16进位,16的倍数;

影响对象内存的因素,成员变量,属性是带下划线的成员变量。

自动重拍成员变量顺序能够优化内存的原因?

内存对齐,8字节对齐。

1.苹果重拍优化分配存储空间,所以属性顺序不用计较。

2.子类不能对父类重排,被继承的属性不能重排

3.类方法不占内存

char 1字节,*(地址) 8字节,int 4字节    double 8字节

2、位域

1个字节8个位域

char a : 2;  // 位域,一个字节存不下直接存下个字节,不会分两段存

char b : 7;

char c : 2;    // 到此3个字节

char d : 2;    // 3

char e : 2;    // 3

3、union 联合体

联合体,公用一块内存空间,所有属性,内存地址相同

作用:节省内存空间;

1.必须能够容纳最大的成员变量

2.通过1计算出来的大小必须是其最大成员变量的(基本数据类型)整数倍

union LG{

char a[7];  // 7

int b;        // 4

};// 8字节

结构体(struct)和联合体区别

1.结构体变量可以共存,共存内存是和,内存开辟比较粗放,只要有成员变量就会开放内存空间

2.联合体只能存在一个,互斥,节省内存空间

4、nonPointerIsa

nonPointerIsa,节省内存空间,系统内存优化手段,isa的优化  8字节 8*8 64位;

nonPointerIsa,以前专门存类对象内存地址;

nonPointerIsa,现存放内容如下:

arm64 (模拟器)

uintptr_t nonpointer : 1;

uintptr_t has_assoc : 1;

uintptr_t weakly_referenced : 1;

uintptr_t shiftcls_and_sig : 52;

uintptr_t has_sidetable_rc : 1;

uintptr_t extra_rc : 8

arm64 (真机)

uintptr_t nonpointer : 1;

uintptr_t has_assoc : 1;

uintptr_t has_cxx_dtor : 1;

uintptr_t shiftcls : 33;

uintptr_t magic : 6;

uintptr_t weakly_referenced : 1;

uintptr_t unused : 1;

uintptr_t has_sidetable_rc : 1;

uintptr_t extra_rc : 19

x86_64

uintptr_t nonpointer : 1;

uintptr_t has_assoc : 1;

uintptr_t has_cxx_dtor : 1;

uintptr_t shiftcls : 44;

uintptr_t magic : 6;

uintptr_t weakly_referenced : 1;

uintptr_t unused : 1;

uintptr_t has_sidetable_rc : 1;

uintptr_t extra_rc :

isa 指针存放联合体,联合体中存放结构体!