您的位置:首页 > 编程语言 > C语言/C++

c语言 内存对齐用法

2015-07-04 14:43 267 查看
#define _INTSIZEOF(n) /

  ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )

1.定义_INTSIZEOF(n)主要是为了某些需要内存的对齐的系统.

2._INTSIZEOF(n)整个做的事情就是将n的长度化为int长度的整数倍。

3.分析:sizeof(n)+sizeof(int)-1---------------即将n 转换为最接近int倍数的数;

               &~(sizeof(int) - 1)
------------去掉int倍数中的余数

对于IX86,sizeof(int)一定是4的整数倍

理论基础:

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

x = nq + r, 其中  0<= r <n                  //最小非负剩余

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<n+r'<=n            //最大正剩余

x+n-1 = qn + (n+r'-1), 其中 0<= n+r'-1 <n    //最小非负剩余

所以 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))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: