C中含位域结构体大小的计算
来源:互联网 发布:浪潮软件新闻 编辑:程序博客网 时间:2024/05/23 23:41
含位域结构体的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 {
char f1 : 3;
char f2;
char f3 : 5;
};
非位域字段穿插在其中,不会产生压缩,在VC6和Dev-C++中得到的大小均为3。
测试:
struct test
{
char a:1;
char :2;
long b:3;
char c:2;
};
test t1;
int len=sizeof(t1); //len=12
struct test
{
char a:1;
char :2;
char b:3;
long c:2;
};
test t1;
int len=sizeof(t1); //len=8
struct test
{
char a:1;
char :2;
char b:3;
char c:2;
};
test t1;
int len=sizeof(t1); //len=1
- C中含位域结构体大小的计算
- [C++]结构体的大小的计算
- C中结构体大小的计算
- C语言中如何计算结构体的大小
- 【c语言】结构体大小计算的例子
- 计算结构体的大小
- 结构体大小的计算
- 计算结构体的大小
- 计算结构体的大小
- 计算结构体的大小
- 计算结构体的大小
- 计算结构体的大小
- 结构体大小的计算
- 计算结构体的大小
- 结构体大小的计算
- 计算结构体的大小
- 结构体大小的计算
- 结构体大小的计算
- Uva 10497 - Sweet Child Makes Trouble 解题报告(递推+大数)
- CONNECT_BY_ISCYCLE
- 优盘数据恢复的妙招
- eclipse new project后设置编码utf-8
- vlc-android源码git下载
- C中含位域结构体大小的计算
- Cracking the coding interview--Q18.2
- MFC框架中WM_COMMAND消息响应顺序
- 流年无罪,错的是那份遇见
- 牛刀小试(三)——java简单的支付界面
- c#操作远程注册表的两种方法
- 微信公众平台开发教程Java版(二)接口配置
- 小学生连任三年班长后落选绝食 称失败没面子
- Apache Karaf Overview 特性 了解