杭州网站搭建公司,商业网站建设试题,网站域名 邮箱,网站商城网络整合营销内存管理机制与内存映射相关。
一、C与C
之所以将C与C放在一起是因为C是C的超集#xff1b; 但是C是面向过程语言#xff0c;C是面向对象的语言#xff1b; C与C都可以使用malloc、calloc、realloc来申请内存空间#xff1b; 其中void* malloc(size_t size)是在内存的动态…内存管理机制与内存映射相关。
一、C与C
之所以将C与C放在一起是因为C是C的超集 但是C是面向过程语言C是面向对象的语言 C与C都可以使用malloc、calloc、realloc来申请内存空间 其中void* malloc(size_t size)是在内存的动态存储区中分配一块长度为size字节的连续区域参数size为需要内存空间的长度返回该区域的首地址 void* calloc(size_t num,size_t size)与malloc相似不过函数calloc() 会将所分配的内存空间中的每一位都初始化为零 void* realloc(void* p,size_t newsize)是给一个已经分配了地址的指针重新分配空间可以做到对动态开辟内存大小的调整 申请内存空间失败会返回NULL用完后通过free释放 C相比C多了newdelete的函数new在底层调用operator new全局函数来申请空间delete在底层通过operator delete全局函数来释放空间执行构造函数和析构函数是C面向对象的特性
二、Objective-C与Swift
iOS通过引用计数和自动释放池来进行内存管理通常引用计数存储在对象的成员isa_t里的extra_rc中在__arm64__环境下extra_rc在内存中占19位在__x86_64__环境下占8位 以__x86_64__环境为例extra_rc大小总共8bit最多存放2^7量级的数值所以当extra_rc达到最大值需要通过另外的结构来存储引用计数 App全局会维护一个SideTables里面包含多个SideTable可以通过对象的hash运算找到对应的SideTable一个SideTable对应多个对象里面有一个引用计数表和弱引用计数表 再次对对象hash运算可以从SideTable中的refcnts中获取对象的引用计数 weak_table中保存weak_entries从weak_entries中通过对象查找某对象的弱引用信息weak_entry_tweak_entry_t内保存着弱引用该对象的指针地址的hash数组 当弱引用一个对象时会通过obj从SideTables找到SideTable找到SideTable中的弱引用表weak_table通过obj从weak_table中的weak_entries找到obj对应的weak_entry_t在obj对应的weak_entry_t的weak_referrer_t中加入弱引用obj的指针 当对象释放时会通过obj从SideTables找到SideTable找到SideTable中的弱引用表weak_table通过obj从weak_table中的weak_entries找到obj对应的weak_entry_t查找weak_entry_t中的weak_referrer_t数组并将weak_referrer_t中存储的指针指向nil 每当有一个新的强引用指针指向对象的引用计数就会1当减少一个强引用指针引用计数就会-1当引用计数为0时对象就会被销毁 对于自动释放池autoreleasepool是一个双向链表结构出栈入栈都是从栈顶开始 objc_autoreleasePoolPush操作对应批量次的AutoReleasePoolPage::push()会把pool中的对象全部压入栈结构 objc_autoreleasePoolPop操作对应批量次的AutoReleasePoolPage::pop()表示出栈会依次给对象发送release消息释放过程在pool自身对应的线程中进行 栈有最大限额超过后会新建一个栈节点添加到pool新的对象会存入新栈 当RunLoop即将进入休眠会销毁old pool同时释放pool中的对象新建new pool 主线程会自动创建RunLoop子线程需要通过获取才会创建RunLoop的作用是保活和任务处理。
不论是java还是dart都有对应的引用计数来进行内存管理机制js的内存管理更像C一样简陋。