含位域结构体的sizeof
2008-05-08 23:54
232 查看
使用位域的主要目的是压缩存储,其大致规则为:
1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。
测试:
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
1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。
测试:
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结构体之位域(位段)的sizeof问题.
- sizeof:(含位域)结构体内存对齐,压缩存储
- 含位域结构体的sizeof
- 结构体(含位域)的sizeof
- sizeof(struct{bit-field})——包含位域的结构体的空间大小
- sizeof:(含位域)结构体内存对齐,压缩存储
- 含位域结构体的sizeof
- 含位域结构体的sizeof
- sizeof(结构体)和内存对齐以及位域
- sizeof(结构体)和内存对齐以及位域
- 含位域结构体的sizeof
- sizeof(结构体)和内存对齐以及位域
- 结构体(含位域)的sizeof 对齐相关
- 如何求结构体成员的偏移地址 || 结构体的 sizeof 总结
- sizeof(空类或空结构体)
- 计算结构体、数组、指针的sizeof
- (转)sizeof()解析和结构体内存对齐
- 内存对齐(sizeof(结构体) 的值跟期望的不一样)
- 关于C/C++中结构体(Struct)类型的sizeof结果的探讨
- c++中冒号(:)和双冒号(::)的用法和c/c++ 位域结构体