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 指针存放联合体,联合体中存放结构体!