含位域结构体的sizeof
2014-09-25 13:31
351 查看
本文转自:http://www.cnitblog.com/wuzhimeili/archive/2007/01/17/21963.html
使用位域的主要目的是压缩存储,其大致规则为:
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
相关文章推荐
- 结构体(含位域)的sizeof 对齐相关
- 结构体(含位域)的sizeof
- 含位域结构体的sizeof
- sizeof:(含位域)结构体内存对齐,压缩存储
- 含位域结构体的sizeof
- 含位域结构体的sizeof
- 含位域结构体的sizeof
- sizeof(struct{bit-field})——包含位域的结构体的空间大小
- (必看)C结构体与C结构体之位域(位段)的sizeof问题.
- sizeof:(含位域)结构体内存对齐,压缩存储
- sizeof(结构体)和内存对齐以及位域
- sizeof(结构体)和内存对齐以及位域
- sizeof(结构体)和内存对齐以及位域
- 内存对齐和sizeof(结构体)
- C语言 中结构体的位域(位段)
- STARTUPINFO si = { sizeof(si) } 结构体的一种初始化方式
- sizeof结构体与内存对齐
- struct结构体和union联合体:字节对齐下的sizeof返回
- sizeof(结构体)和内存对齐
- 关于结构体,内存对齐,sizeof