黑马程序员技术交流社区
标题:
关于C语言结构体中位域的学习和整理
[打印本页]
作者:
Beacon
时间:
2014-10-26 23:39
标题:
关于C语言结构体中位域的学习和整理
下面是结构体中位域的概念和我自己的理解,和同学们共勉喔~~~
使用位域的主要目的是压缩存储,其大致规则为:
1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。
首先找出其中成员最大的对齐值,如 struct node { char a; int b;}AA; 其中成员最大的对齐值是int b 为4个字节。首先char a对齐 1***,1111
不够4个 补充够4个。 最后检验整个结构体的总大小为 最大对齐值的整数倍!所以最后 sizeof(AA)=8; 另外如果使用//#pragma pack (n) 就是取n的值与各个对齐值比较 取其中较小的那
个作为标准!!比如 //#pragma pack (2) struct node { char a; int b;}AA; 那么sizeof(AA)=6 首先char a 对齐 1*,11,11 。再如//#pragma pack (2) struct node {
char a; int b;,char c;}AA; 那么sizeof(AA)=8 首先char a对齐 1*,11,11,1*
作者:
doudou33420
时间:
2014-10-27 01:09
what is this.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2