A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Beacon 中级黑马   /  2014-10-26 23:39  /  883 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面是结构体中位域的概念和我自己的理解,和同学们共勉喔~~~
使用位域的主要目的是压缩存储,其大致规则为:
       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*

评分

参与人数 1技术分 +1 收起 理由
星河鹭起 + 1

查看全部评分

1 个回复

倒序浏览
what  is  this.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马