<C/C++>C语言字节对齐问题总结
2014-05-20 20:12
846 查看
现在打算把自己的掌握的一些东西以博客的形式展现出来,一、作为自己的笔记,防止以后忘记有个博客可以方便自己查询,二、分享出来,如果写的正确可以给还不懂的人一些帮助,如果写错了,别人帮忙指出来,对自己也是一种提高。今天这篇博客打算写一下关于C语言字节对齐的问题。
对于32bit编译器,sizeof(node1)和sizeof(node2)的大小相等吗,大小是多少,如果不等,大小分别又是多少?这就是今天我要讲的字节对齐问题,如果你掌握了上面的问题你将很容易答上来。
对齐值:
对于每一个基础类型(如:char、int、short、long、double)他们都有一个字节大小(如char占一个字节等),他们还相对应的存在一个对齐值。但是要明白类型所占的字节数和对齐值不是一样大的。对齐值是可以通过#pragma
pack (2) /*指定按2字节对齐*/制定,可以通过#pragma pack ()取消。
对于32bit编译器:
对于struct的对齐值,等于在其包含的类型中取最大的对齐值,如上面的struct node1的对齐值=4,应该其所包含的类型中对齐值最大的为int,int的对齐值=4。
我们先运行一段程序,根据程序结果来讲解对齐值的概念:
程序如下:
用32bit编译器,运行结果如下:
为什么node1的结果是16,而node2的结果是12?下面我们来分析一下,
1)首先我们先判断node1和node2的对齐值分别是多少,这个答案应该很明显,它们都是4;
2)对于node1而言,先存储1个byte的a,由于对齐值是4,所以后面还有3个byte空余,接下来存储4个byte的b,因此存放不下,所以从下一个4byte开始,之前的3个byte只能空闲,以此类推,最后node1占16个byte。
3)对于node2而言,先存储1个byte的a, 由于对齐值是4,所以后面还有3个byte空余,接下来存储1个byte的c,能够存放下,还剩2个空闲的byte,接下来存放4个byte的b,存放不下,从下一个4byte开始,以此类推,最后node2占12个byte。
struct node1{ char a; int b; char c; int d; }; struct node2{ char a; char c; int b; int d; };
对于32bit编译器,sizeof(node1)和sizeof(node2)的大小相等吗,大小是多少,如果不等,大小分别又是多少?这就是今天我要讲的字节对齐问题,如果你掌握了上面的问题你将很容易答上来。
对齐值:
对于每一个基础类型(如:char、int、short、long、double)他们都有一个字节大小(如char占一个字节等),他们还相对应的存在一个对齐值。但是要明白类型所占的字节数和对齐值不是一样大的。对齐值是可以通过#pragma
pack (2) /*指定按2字节对齐*/制定,可以通过#pragma pack ()取消。
对于32bit编译器:
类型 | char | short | int | long | double |
所占字节 | 1 | 2 | 4 | 4 | 8 |
(缺省)对齐值(byte) | 1 | 2 | 4 | 4 | 4 |
我们先运行一段程序,根据程序结果来讲解对齐值的概念:
程序如下:
struct node1{ char a; int b; char c; int d; }; struct node2{ char a; char c; int b; int d; };
int main()
{
printf("%d,%d\n",sizeof(node1),sizeof(node2));
return 0;
}
用32bit编译器,运行结果如下:
为什么node1的结果是16,而node2的结果是12?下面我们来分析一下,
1)首先我们先判断node1和node2的对齐值分别是多少,这个答案应该很明显,它们都是4;
2)对于node1而言,先存储1个byte的a,由于对齐值是4,所以后面还有3个byte空余,接下来存储4个byte的b,因此存放不下,所以从下一个4byte开始,之前的3个byte只能空闲,以此类推,最后node1占16个byte。
3)对于node2而言,先存储1个byte的a, 由于对齐值是4,所以后面还有3个byte空余,接下来存储1个byte的c,能够存放下,还剩2个空闲的byte,接下来存放4个byte的b,存放不下,从下一个4byte开始,以此类推,最后node2占12个byte。
相关文章推荐
- <C++ STL set>集合并,交,差,对称差总结
- <C语言>结构体与联合体(共用体)的地址排布问题(内存字节对齐)
- ssh错误总结1.1----关与struts2中极为恶心的<s:action>标签问题
- C++中的字节对齐分析 &lt;转&gt;
- <数据结构与算法分析 C++描述>算法分析之最大子序列和问题
- <C++学习笔记>预处理功能
- <<c++ primer>> 函数指针的笔记
- <林锐高质量c/c++编程指南>记录
- <logic:iterate>问题
- C和C++语言学习总结(资料来自<高质量C++/C 编程指南> 林锐博士 2001 年7 月24)
- <转> 面试java高级工程师、项目经理等的常见问题
- <java>程序当前路径问题
- VB 长整型和字节数组的转换问题 (Long<>Byte)
- <林锐高质量c/c++编程指南>记录 <续>
- 《C++第九周实验报告1-1》--------接第8周任务1,定义Complex类中的<<和>>运算符的重载,实现输入和输出
- 解决用<img src="<%# Eval("ShowPhoto")%>"动态绑定图片,发布到IIS上无法显示的问题
- <转>CloudSim 讨论组提的问题
- <杂谈1002>HTML作为GUI前段,Java/NDK作为业务后端开发方式总结
- <<c++ primer>> 指向const对象指针&const指针
- <转载> 设计模式精解c++-GoF 23 种设计模式解析