Class的底层结构

2021-01-12  本文已影响0人  水中的蓝天
struct bucket_t {
cache_key_t  _key; //SEL作为key  如: _key --> @selecter(test)
IMP _imp;   //函数的内存地址       如: _imp --> test 方法的地址
}
struct cache_t {
struct bucket_t   *_buckets; //散列表
mask_t   _mask;   //散列表的长度减一;_mask的值是随着存储的增加会发生变化,当内存空间用完了就会扩容(变为原来空间的两倍),扩容后清空缓存,再来一遍
mask_t _occupied; //已经缓存的方法数量
}
位域宏定义(真机环境arm64)
# if __arm64__
#   define ISA_MASK        0x0000000ffffffff8ULL
#   define ISA_MAGIC_MASK  0x000003f000000001ULL
#   define ISA_MAGIC_VALUE 0x000001a000000001ULL
#   define ISA_BITFIELD                                                      \
     uintptr_t nonpointer        : 1; 拿二进制的1位来存储  \
     uintptr_t has_assoc         : 1;                                       \
     uintptr_t has_cxx_dtor      : 1;                                       \
     uintptr_t shiftcls          : 33; /*MACH_VM_MAX_ADDRESS 0x1000000000*/ \
     uintptr_t magic             : 6;                                       \
     uintptr_t weakly_referenced : 1;                                       \
     uintptr_t deallocating      : 1;                                       \
     uintptr_t has_sidetable_rc  : 1;                                       \
     uintptr_t extra_rc          : 19
#   define RC_ONE   (1ULL<<45)
#   define RC_HALF  (1ULL<<18)

关联对象

关联对象.png

SideTable

SideTable.png
内存管理之weak指针

自动释放池

线程池
线程池能有效的处理多个线程的并发问题,避免大量的线程因为互相强占系统资源导致阻塞现象,能够有效的降低频繁创建和销毁线程对性能所带来的开销。真正线程池的实现是通过ThreadPoolExecutor,ThreadPoolExecutor通过配置不同的参数配置来创建线程池
参考1
参考2

atomic之PropertyLock

上一篇 下一篇

猜你喜欢

热点阅读