关于位域在结构体的应用主要要注意内存对齐规则的理解和空域的理解
使用位域的主要目的是压缩存储,其大致规则为:
1)如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
2)如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
3)如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
4)如果位域字段之间穿插着非位域字段,则不进行压缩;
5)整个结构体的总大小为最宽基本类型成员大小的整数倍。
例如:
#includeint main() { union { struct { unsigned short s1:3; unsigned short s2:3; unsigned short s3:3; }x; char c; }v; v.c=100; printf("sizeof(v)=%d\n",sizeof(v)); printf("s1=%d\n",v.x.s1); printf("s2=%d\n",v.x.s2); printf("s3=%d\n",v.x.s3); return 0; }
分析:100的二进制:0110 0100,结构体中s1,s2,s3共9位,则占用2直接,故sizeof(v)=2;对应的s1三位二进制100,s1=4;s2三位二进制100,s2=4;s3三位二进制001,s3=1。
结果:
再例如:
#includeint main() { union { struct { unsigned short s1:3; unsigned short s2:3; unsigned short s3:3; unsigned short s4:7; }x; char c; }v; v.c=100; printf("sizeof(v)=%d\n",sizeof(v)); printf("s1=%d\n",v.x.s1); printf("s2=%d\n",v.x.s2); printf("s3=%d\n",v.x.s3); printf("s4=%d\n",v.x.s4); return 0; }
结果:
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。