有一段 内存管理模块的代码,求解读
unsigned long pageSize = ProtectionContext::getPageSize(); // 页大小
unsigned long mask = pageSize - 1;
//size_before 是什么含义没有明白,我猜可能是求当前页面还剩多少byte。
// 但是验证不是很正确。
// _currentPos 是分配器当前指针的位置,比如说10M,当分配2k时候将10M向后移动(2k+4)
size_before = (pageSize - ((size_t)_currentPos & mask)) & mask; // 没有看懂这一句
// 4是说在分配内存之前要预留一个位置来存放分配了多大的内存。
// chunkOverhead 是自己划分的内存块之间的隔离地带的大小,防止越界用的。
if (size_before && (size_before < (4+chunkOverhead)) )
size_before += pageSize;//换一页
[解决办法]
为了保证内存分配的自由度且防止大量产生内存碎片,系统采用分段加分页的方式,最小的分配单元为内存页,若所需内存不为页大小的整数倍,则向上取整。
一个内存页中被_currentPos分割,而size_before就是前半部分,即内存页开头到_currentPos的内存大小。
[解决办法]
其他没看,红字部分的代码,似乎和平时看到的对齐代码不一致。
典型的对齐代码:
size = (size + mask - 1) &~ (mask - 1);