内存的分配
- 项目中在申请物理内存时是以内存页为单位申请的,IOS一个内存页是16K,其他是64K,下面我们都以内存页64K来说明
- 内存页的划分规则(即也是内存对齐方式):
以内存块16字节方式划分,64K=65535字节 / 16字节= 4096个,翻译:将65535字节分成4096块,每块大小是16字节
以内存块32字节方式划分,64K=65535字节 / 32字节= 2048个,翻译,将65535字节分成2048块,每块大小为32字节
……
以内存块32768字节方式划分,64K=65535字节 / 32768字节= 2个,翻译,将65535字节分成2块,每块大小是32768字节
- 假设申请一个30字节内存
- size = 30
- 用size为MemSizeToPoolTable索引,即MemSizeToPoolTable[30],i=30, 30在17-》32区间段,对应的块信息PoolTable[1].Blocksize=32,
- 找到以32字节方式划分内存页,如果内存页没有满,则申请一个32字节的块,如果满了,在物理内存上申请一个以内存块32字节方式划分的内存页,然后申请一个32字节的块
- 分配流程
- AllocateBlockFromPool()
- FFreeMem* Free = (FFreeMem*)((uint8*)Pool->FirstMem + --Pool->FirstMem->NumFreeBlocks * Table->BlockSize);
- 分配查找空的块时,是从后往前查找的
ExhaustedPool
- 如果这次分配是该Pool的最后一个Block,将该Pool从链表的首地址(FirstMem),赋值到ExhaustedPool链表上