结构体大小计算之位域字段
来源:互联网 发布:淘宝怎么加好友 编辑:程序博客网 时间:2024/05/19 18:47
类和结构可包含比整型类型占用更少存储空间的成员。这些成员被指定为位域。位域成员声明符规范的语法如下:
语法
declarator : constant-expression
下面的示例声明包含位域的结构:
// bit_fields1.cpp// compile with: /LDstruct Date { unsigned short nWeekDay : 3; // 0..7 (3 bits) unsigned short nMonthDay : 6; // 0..31 (6 bits) unsigned short nMonth : 5; // 0..12 (5 bits) unsigned short nYear : 8; // 0..100 (8 bits)};
Date 类型的对象的概念上的内存布局如下图所示。
请注意,nYear 的长度为 8 位,并且会溢出声明类型 unsigned short 的字边界。因此,它始于新 unsigned short 的开头。并不必使所有位域均适合基础类型的对象;根据声明中请求的位数来分配新的存储单元,因此该结构体大小为4个字节。声明为位域的数据从低位到高位进行排序,如上图所示。
如果结构的声明包含长度为 0 的未命名字段(如以下示例所示),
// bit_fields2.cpp// compile with: /LDstruct Date { unsigned nWeekDay : 3; // 0..7 (3 bits) unsigned nMonthDay : 6; // 0..31 (6 bits) unsigned : 0; // Force alignment to next boundary. unsigned nMonth : 5; // 0..12 (5 bits) unsigned nYear : 8; // 0..100 (8 bits)};
则内存布局如下图中所示。
位域的基础类型必须是整型类型,如基本类型中所述。
总结如下
使用位域的主要目的是压缩存储,其大致规则为:
- 1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
- 2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
- 3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
- 4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
- 5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。
案例如下:
0 0
- 结构体大小计算之位域字段
- 结构体大小计算之位域字段
- 结构体大小计算之位域字段
- 结构体的大小的计算与空间的优化--之位域字段
- 关于结构体,联合体,位字段的大小的
- 结构体,联合的位域定义方法,以及结构体大小的计算
- C结构体之位域(位段)结构体大小
- 结构体和位段的大小计算
- 结构体大小的计算、联合、位段
- 分别在gcc和vc中计算结构体和位域的大小
- 计算结构体大小
- 计算结构体大小
- 结构体大小计算
- 计算结构体大小
- 计算结构体大小
- 结构体大小计算
- 结构体大小计算
- 结构体大小计算
- Mysql保留字问题 出现1064(42000)错误
- JAVA 使用 JDBC 连接 mysql
- opencv 特征点匹配和背景识别
- io流总结
- java编程思想 第十三章 正则表达式
- 结构体大小计算之位域字段
- 请你谈谈对spring的理解?
- C++设计模式——组合模式
- 栈的压入、弹出序列
- iOS 投机流实现 无限轮播图
- 学习笔记 Tianmao 篇 FragmentTabHost (TabHost升级版)
- hdu 4507 吉哥系列故事——恨7不成妻
- 枚举
- 虚析构函数的实现原理