构造体中变量后面的冒号_解决结构体中冒号的含义

本文深入探讨位域结构体的sizeof规则,包括类型相同位宽之和小于类型大小、不同类型编译器差异、非位域字段穿插的影响。通过示例解释了位域的存储布局,并介绍了位结构体的定义、用途及其内存分配方式,强调了位域定义顺序和CPU端模式对内存占用的影响。
摘要由CSDN通过智能技术生成

含位域结构体的sizeof:

前面已经说过,位域成员不能单独被取sizeof值,我们这里要讨论的是含有位域的结构体的sizeof,只是考虑到其特殊性而将其专门列了出来。

C99规定int、unsigned int和bool可以作为位域类型,但编译器几乎都对此作了扩展,允许其它类型类型的存在。

使用位域的主要目的是压缩存储,其大致规则为:

1)

如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字

段将紧邻前一个字段存储,直到不能容纳为止;

2)

如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字

段将从新的存储单元开始,其偏移量为其类型大小的整数倍;

3)

如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方

式,Dev-C++采取压缩方式;

4) 如果位域字段之间穿插着非位域字段,则不进行压缩;

5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。还是让我们来看看例子。示例1:struct BF1

{

char f1 : 3;

char f2 : 4;

char f3 : 5;

};其内存布局为:|__f1___|____f2___

|__|____f3______|______|

|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|位域类型为char,第1个字节仅能容纳下f1和f2,所以f2被压缩到第1个字节中,而f3只能从下一个字节开始。因此sizeof(BF1)的结果为2。示例2:struct BF2

{

char f1 : 3;

short f2 : 4;

char f3 : 5;

};由于相邻位域类型不同,在VC6中其sizeof为6,在Dev-C++中为2。示例3:struct BF3

{

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值