最近在看Nginx
的源代码,阅读其有关内存池实现的时候发现下面一段代码
|
|
这段代码的意图很明显,就是将指针m
按照NGX_ALIGNMENT
大小进行对齐,那么它是如何进行对齐的呢?关键就在ngx_align_ptr
,它其实是个宏,定义如下:
|
|
我刚看到这个宏的时候觉得很神奇,完全不知道它进行内存对齐的原理是什么。于是打算人肉运行一下这段代码,看能不能发现里面的玄机。
首先类型转换都去掉,这样代码能看的清楚一点:
|
|
在进行内存的对齐的时候,一般都是将地址按2
的幂进行对齐,也就是说a
的末尾必然由0组成。假设有N
个0,那么将a
减去一后,就得到了一个末尾有N
个1
其他位都是0
的数,再取反的话就变成了末尾有N
个0,其他位都是1
的数。那么再将这个数与任何数相与都将把被与数的最后N
位变成0
而其他位置不变,而这个数正是a
的整数倍。那么加上a-1
的目的是什么呢?很明显是为了最后得到的数要比p
大,不然后的话,分配的内存就可能占用了别的已分配空间。
另外上面在进行运算之前将所有的变量都转换成了uintptr_t
类型,该类型本质上也是个整型,但是该整型的大小能够安全的容纳指针变量,相比于直接用整数类型而言更加具有可移植性和安全性。
(完)