内存优化算法
《*********数据类型在内存的所占的大小*********》
《32位编辑器》
char : 1字节
char* (指针变量):4字节
short int :2字节
int : 4字节
unsigned int : 4字节
long: 4字节
long long :8字节
unsigned long long:8字节
float :4字节
double:8字节
《*** 64位编译器***》
char :1字节
char* (指针变量):8字节
short int :2字节
int :4字节
unsigned int 4字节:
long:8字节
long long :8字节
unsigned long long :8字节
float:4字节
double: 8字节
!mark:64bit 和32bit 下 long 和 char* 所占的字节是不同的
《内存对齐的原则》
1:数据成员对齐原则:结构(struct)(或者联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如数组,结构体)的整数倍开始 (比如int为4字节,则要从4的整数倍地址开始存储)。
min(当前开始的位置m n)算法: m=9 n =4
9,10,11,12 进行填充 一直到整数倍
2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储,(struct a里面存有 struct b ,b里有char , int ,double 等元素,那b 应该从8的整数倍开始存储)
3:结构体的总大小,也就是sizeof 的结果,必然是其内部最大成员的整数倍,不足的补齐。
《ISA 的 基础知识》
ISA:8字节 64位
Nonpointer:(0-7)表示是否对isa 指针开启指针优化,0:纯ISA指针,1:不止是类对象地址,ISA中包含了类信息,对象的引用计数等。
has_assoc: 关联对象标志位,0:没有,1存在
has_cxx_dtor:该对象是否有C++或者Objc的析构器,如果有析构函数,则需要做析构逻辑,如果没有,则可以更快的释放对象。
shittcls: (8-31)(cls>>3)存储类指针的值,开启指针优化的情况下,在arm64架构中有32位用来存储类指针。
magic:(32-39)用于调试器判断当前对象是真的对象还是没有初始化的内存空间。
(40-47 )
weakly_referenced:标志对象是否被指向或者曾经指向一个ARC的弱变量,没有弱引用的对象可以更快的释放。
dealloccationg:标志对象是否正在释放对象。
has_sidetable_rc:当前对象的引用计数大于10时,则需要借用该变量存储进位。
48-56 57-64
extra_rc:表示该对象的引用计数值,实际上是引用计数值减一,例如:如果对象的引用计数为10.那么extra_rc为9,如果引用计数大于10 ,则需要使用上面的has_sidetable_rc;

《内存对齐》


*******************************
2^n 对齐算法
8 +7
8: 0000 1000
7: 0000 0111
8+7: 0000 1111 ----①
~7 : 1111 1000 ----②
①&②:0000 1000 -----③ = 8
*********************************
8字节对齐 --参照对象的属性
16字节对齐 -- 参照对象 对象之间更加安全。
避免开辟内存的溢出风险。出现野指针出现。
《*** 内存存储算法 ***》
请看截图----》》》


po zone->calloc 这个函数 就会找到函数的底层实现的地方,继续往下走的时候 就会找到这个函数。


这个地方的就是calloc 对对象内存的处理。
size:对象申请的内存大小
(size + NANO_REGIME_QUANTA_SIZE -1) >> SHIFT_NANO_QUANTUM;
(40 + 16-1)>> 4 :size 加上 标准偏移量 -1 然后右移四位
slot_bytes = k << SHIFT_NANO_QUANTUM ;
左移四位
40 16 字节对齐 == > 48
得到当前需要开辟的空间大小。
isa指针关联到class
obj->initInstanceIsa(cls, dtor);


union 联合体

网友评论