首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

有一段 内存储器管理模块的代码,求解读

2013-09-10 
有一段 内存管理模块的代码,求解读unsigned long pageSize ProtectionContext::getPageSize() // 页大

有一段 内存管理模块的代码,求解读
     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);

热点排行