黑马程序员技术交流社区

标题: 关于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