结构体与位域的对齐
来源:互联网 发布:中国指数研究院 知乎 编辑:程序博客网 时间:2024/06/15 12:48
![](http://img.my.csdn.net/uploads/201211/18/1353234167_1941.png)
![](http://img.my.csdn.net/uploads/201211/18/1353234190_6103.png)
![](file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/enhtmlclip/Image.png)
![](file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/enhtmlclip/Image.png)
![](file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/enhtmlclip/Image.png)
![](file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/enhtmlclip/Image.png)
![](file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/enhtmlclip/Image%281%29.png)
![](file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/enhtmlclip/Image%282%29.png)
![](file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/enhtmlclip/Image%283%29.png)
![](file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/enhtmlclip/Image.png)
![](http://img.my.csdn.net/uploads/201211/18/1353234423_2507.png)
![](http://img.my.csdn.net/uploads/201211/18/1353234238_3547.png)
![](http://img.my.csdn.net/uploads/201211/18/1353234263_6610.png)
![](http://img.my.csdn.net/uploads/201211/18/1353234277_1320.png)
![](file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/enhtmlclip/Image%284%29.png)
![](file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/enhtmlclip/Image%285%29.png)
位域:
![](file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/enhtmlclip/Image%286%29.png)
![](file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/enhtmlclip/Image%287%29.png)
![](http://img.my.csdn.net/uploads/201211/18/1353234456_1016.png)
![](http://img.my.csdn.net/uploads/201211/18/1353234468_5876.png)
C99规定int、unsigned int和bool可以作为位域类型,但编译器几乎都对此作了扩展,
允许其它类型类型的存在。
使用位域的主要目的是压缩存储,其大致规则为:
1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;(经测试此条好像仅限于char型,整型可以跨域存储)
3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。
***************************************************************************/
struct s1
{
int i: 8;
int j: 4;
int a: 3;
double b;
};
struct s2
{
int i: 8;
int j: 4;
double b;
int a:3;
};
printf("sizeof(s1)= %d\n", sizeof(s1));
printf("sizeof(s2)= %d\n", sizeof(s2));
result: 16, 24
第一个结构体中,i,j,a共占15个位,不足8个字节,按double 8字节对齐,共16字节
- 结构体与位域的对齐
- 结构体与位域的对齐:
- 结构体与位域的对齐
- 结构体与位域的对齐
- 结构体的内存对齐问题与位域
- 结构体的内存对齐问题与位域
- 位域与结构体对齐
- 位域与结构体对齐
- 位域与结构体对齐
- 位域与结构体对齐
- 位域与结构体对齐
- 带有位域的结构体对齐
- 位域结构体的字节对齐
- “位域”与结构体内部对齐、结构体外部对齐(自己定义的)
- 结构体对齐(图解)与位域
- 结构体内存对齐与位域
- C语言 结构体的内存对齐问题与位域
- C语言 结构体的内存对齐问题与位域
- HttpsURLConnection添加SSL认证
- 五大通信设备厂商:华为存隐忧,中兴已掉队
- 高效开发Android工具和网址
- 机器学习1:回归(regression)
- Deprecated: Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a futu
- 结构体与位域的对齐
- Jenkins之系统设置
- Hadoop好友推荐系统-组别数据入库
- 自用基础
- 关于Guava中令牌桶算法RateLimiter的理解
- 在输入中文的时候,高亮字段影响字符长度判断的解决方法
- Head First设计模式笔记(设配器模式)
- 智能标签
- MyBatis 九个例子