内存地址(字节) 对齐
来源:互联网 发布:数组长度函数mfc 编辑:程序博客网 时间:2024/06/11 08:56
#pragma pack(n) //n = 1,2,3.。。。 可以改变系统默认地址对齐大小
#pragma pack(1) //改为1字节对齐
struct s1 { char a; int b; char c;};
int main ()
{
struct s1 s;
printf("%d\n",sizeof(s)); //s = 6
}
数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问
struct s1{ char a;int b; double d; char c; };
int main ()
{
struct s1 s;
printf("%d\n",sizeof(s)); //s = 24 8字节对齐 sizeof(double)=8
}
C语言字节对齐宏:
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) //n为2的幂次方
这个宏的定义咋一看有点丈二和尚摸不着头脑,不过网上有对齐的解释,看后相信会豁然明朗了:
对于两个正整数 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++:字节对齐(内存地址对齐)
- aligned 对齐 ??内存对齐/字节对齐/数据对齐/地址总线对齐?
- 结构体字节对齐---内存字节对齐(转载)
- <C语言>结构体与联合体(共用体)的地址排布问题(内存字节对齐)
- 自然对齐(内存地址)
- 内存字节对齐
- 内存字节对齐
- 内存字节对齐
- 内存字节对齐详解
- 内存中字节对齐
- c++ 内存 字节对齐
- 内存字节对齐详解
- 内存字节对齐
- 内存字节对齐
- 内存字节对齐
- 关于字节内存对齐
- 内存字节对齐总结
- osc代码分析
- Mail,邮件服务(一):邮件服务的历史及运作机制
- JSP页面中的pageEncoding和contentType两种属性的区别
- 线程与进程
- 完整nginx配置文件(包含权重均衡配置)
- 内存地址(字节) 对齐
- java 集合中的接口
- oracle中的表操作
- Yun_Curl_Multi/ curl_multi的用法
- 原来像那种uitableview上的广告条是个tableHeaderView
- iOS开发中需要的素材
- 脚本调试
- qt4.8.4安装以及64位程序编译方法
- 子查询中禁止使用order by