Nginx基础. Nginx中内存地址对齐(转)
来源:互联网 发布:菅野洋子抄袭 知乎 编辑:程序博客网 时间:2024/06/06 18:42
下面的内容取自 http://segmentfault.com/a/1190000002771908 (侵删, 感谢)
当a为2的某个幂的值时(例如a=2^2=4,或a=2^3=8),有以下特点:
a = 4: 二进制: 0000 0100 从右起,第三位为1,剩下全为0;a = 8: 二进制: 0000 1000 从右起,第四位为1, 剩下全为0;a = 16: 二进制: 0001 0000 从右起,第五位为1,剩下全为0;
a - 1 = 3: 二进制: 0000 0011 从右起,第三位之前,全是1;a - 1 = 7: 二进制: 0000 0111 从右起,第四位之前,全是1;a - 1 = 15: 二进制: 0000 1111 从右起,第五位之前,全是1;
~(a - 1) = ~3: 二进制: 1111 1100 从右起,第二位之后,全是1;~(a - 1) = ~7: 二进制: 1111 1000 从右起,第三位之后,全是1;~(a - 1) = ~15: 二进制: 1111 0000 从右起,第四位之后,全是1;(理解的关键点)一个数,一定是这个数的二进制从右起第一个不为零的位所表示的数的整数倍
比如:
a = 12: 二进制: 0000 1100从右起,第一个不为零的位所表示的整数为 0000 0100 即 4
那么,a = 12 一定是 4 的整数倍
如果,我们需要任意的一个数a对4取整怎么办呢?很简单,只需要把a从右起的若干位置0就可以了。
比如:
a = 13: 二进制:0000 1101
向0000 0100 即 4 取整,只需要将 0000 1101从右起,前两位置0,即可得到,0000 1100 即12
这个置0的过程可以表达为0000 1101 & 1111 1100
而 1111 1100 = ~(4 - 1),因此,13 对 4 取整的二进制运算即为:13 & ~(4 - 1)
可以看到,这样的二进制运算的结果是向下取整数倍。
但是,在申请内存时,只能比需求的大,而不能比需求的小,因此需要向上取整数倍:
对于一个任意的数d和一个2的任意次幂a:
d对a向下取整的二进制运算为:d & ~(a -1)
d对a向上取整的二进制运算为:(d + (a - 1)) & ~(a - 1)
相信到这里,已经可以很容易理解ngx_align这个宏的含义了
#define ngx_align(d, a) (((d) + (a - 1)) & ~(a - 1))
===========分割线===============
0 0
- Nginx基础. Nginx中内存地址对齐(转)
- nginx中内存对齐调用的函数
- Nginx内存对齐优化
- Nginx内存对齐优化
- Nginx中发现的一个内存对齐宏定义
- nginx源码分析--内存对齐处理
- C++中内存地址对齐
- 【Nginx核心基础】内存池
- nginx中绑定独立IP地址
- nginx中绑定独立IP地址
- nginx基础
- nginx基础
- Nginx基础
- Nginx基础
- nginx 基础
- Nginx基础
- Nginx基础
- Nginx基础
- Android Api Demos登顶之路(六十五)Graphics-->AlphaBitmap
- Linux多线程相关事例
- Java final关键字
- LeetCode Compare Version Numbers
- The Log:每个程序员都应该知道有关实时数据的统一抽象(3)日志与实时流处理
- Nginx基础. Nginx中内存地址对齐(转)
- C++监听文件夹下的添加、修改、删除文件事件
- 消息推送实现方法、移动终端及消息推送系统
- System.OutOfMemoryException
- How Many Tables(hdu1213)
- FlyWeight模式/Facade模式
- sofa-pbrpc源码分析之RpcServerOptions
- leetcode--Search in Rotated Sorted Array
- 分片(Sharding)的全局ID生成