Chinaunix首页 | 论坛 | 博客
  • 博客访问: 157487
  • 博文数量: 50
  • 博客积分: 83
  • 博客等级: 民兵
  • 技术积分: 297
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-12 11:47
文章分类
文章存档

2012年(43)

2011年(7)

分类:

2012-04-10 16:56:05

记得是在看内核的时候,刚好看到这样的解释,抄下:





#define _INTSIZEOF(n)  ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
说能够在某些系统中内存对齐.(估计是得到一个2 或者4的整数倍)
这个好象就是(x+3)&~3
这样就能满足对齐了吗?
请从数学上给说说.
谢谢


(作者:win_hate):

对于两个正整数 x, n 总存在整数 q, r 使得

x = nq + r, 其中  0<= r
q, r 是唯一确定的。q = [x/n], r = x - n[x/n]. 这个是带余除法的一个简单形式。在 c 语言中, q, r 容易计算出来: q = x/n, r = x % n.


所谓把 x 按 n 对齐指的是:若 r=0, 取 qn, 若 r>0, 取 (q+1)n. 这也相当于把 x 表示为:

x = nq + r', 其中 -n < r' <=0                //最大非正剩余   

nq 是我们所求。关键是如何用 c 语言计算它。由于我们能处理标准的带余除法,所以可以把这个式子转换成一个标准的带余除法,然后加以处理:

x+n = qn + (n+r'),其中 0
x+n-1 = qn + (n+r'-1), 其中 0<= n+r'-1
所以 qn = [(x+n-1)/n]n. 用 c 语言计算就是:

((x+n-1)/n)*n

若 n 是 2 的方幂, 比如 2^m,则除为右移 m 位,乘为左移 m 位。所以把 x+n-1 的最低 m 个二进制位清 0就可以了。得到:

(x+n-1) & (~(n-1))
阅读(1070) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

smartshallot2012-04-11 11:51:54

(x+3)&~3
其中&~3就是&FFFFFFFC,最后结果后两位肯定是00,就是能被4整除。
如果x能被4整除,那么x+3与运算后就是x。
如果x不能被4整除,那么x+3与运算后就是(x/4+1)*4。
这就是内存对齐。