UE 内存管理(内存分配)(四)

内存的分配

  • 项目中在申请物理内存时是以内存页为单位申请的,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字节内存
  1. size = 30
  2. 用size为MemSizeToPoolTable索引,即MemSizeToPoolTable[30],i=30, 30在17-》32区间段,对应的块信息PoolTable[1].Blocksize=32,
  3. 找到以32字节方式划分内存页,如果内存页没有满,则申请一个32字节的块,如果满了,在物理内存上申请一个以内存块32字节方式划分的内存页,然后申请一个32字节的块
  • 分配流程
  • AllocateBlockFromPool()
  • FFreeMem* Free = (FFreeMem*)((uint8*)Pool->FirstMem + --Pool->FirstMem->NumFreeBlocks * Table->BlockSize);
  • 分配查找空的块时,是从后往前查找的

ExhaustedPool

  • 如果这次分配是该Pool的最后一个Block,将该Pool从链表的首地址(FirstMem),赋值到ExhaustedPool链表上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值