内存对齐算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/itworld123/article/details/83902675
---------------------------------------------
-- 时间:2018-11-09
-- 创建人:Ruo_Xiao
-- 邮箱:[email protected]
---------------------------------------------

最近在研读“Tiniux”操作系统源代码,在内存分配中看见如下代码:

#define OSMEM_ALIGN_SIZE(size) (((size) + OSMEM_ALIGNMENT - 1) & ~(OSMEM_ALIGNMENT-1))

百思之后恍悟,故记录如下:

1、功能:对待分配的字节大小“size”按照“OSMEM_ALIGNMENT ”进行对齐,一般OSMEM_ALIGNMENT 为4(可更改)。

2、栗子

(1)当 size = 2 时,为了保证内存对齐,需要分配 4B 内存,即:额外再分配 2B 。计算过程如下:

sizeOSMEM_ALIGNMENT - 1 = 5,5 & ~(OSMEM_ALIGNMENT - 1) = 101b & ~(3) = 101b & 100b = 4,满足要求。

(2)当 size = 6 时,需要分配 8B 内存,即:额外再分配 2B 。计算过程如下:

size + OSMEM_ALIGNMENT - 1 = 9, 9 & ~(OSMEM_ALIGNMENT  - 1) = 101b & ~ (3) = 101b & 100b = 8,满足要求。

3、本质

(1)因为内存对齐的缘故,地址都是OSMEM_ALIGNMENT的倍数,故地址的低l位都是0,即:取整抛余。

(2)同时,分配的内存至少比申请的内存多,即:比 size 大。sizeOSMEM_ALIGNMENT - 1 的原因是无论size为几,都可以让结果恰好增大到离size最近的OSMEM_ALIGNMENT的倍数的数。

(SAW:Game Over!)

猜你喜欢

转载自blog.csdn.net/itworld123/article/details/83902675