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))
((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))
相关文章推荐
- 《C语言及程序设计》实践参考——紧急救援
- Ubuntu下用终端编译运行c++程序
- 《C语言及程序设计》实践参考——日期结构体
- 使用C++11thread实现的一道面试题(一)
- c++ 适配器
- 【C/C++相关】论程序员写技术博客的重要性
- c++函数解析
- stl之multiset容器的应用
- C语言之自定义__DATE__格式
- C++ && 汇编
- C语言中测试程序运行时间(亲自测试过)
- C语言注释规范
- 《C语言及程序设计》实践参考——个税计算器之码数分离
- 《C语言及程序设计》实践参考——体重监测器
- 《C语言及程序设计》实践参考——点结构体
- C++ Builder如何使用蓝牙打印机
- 《C语言及程序设计》实践参考——学生成绩处理
- 《C语言及程序设计》实践参考——复数结构体
- (c++)Invalid parameter passed to C runtime function
- 【Effective C++ 读书笔记】条款02: 尽量以 const, enum, inline 替换 #define