C++中的位域(bit-filed):一种节省空间的成员
有一种被称为位域(bit-field) 的特殊的类数据成员,它可以被声明用来存放特定数目的位。位域必须是有序数据类型。它可以有符号也可以无符号。例如:
//
unsigned int modified : 1; // 位域 (bit-field)
};
位域标识符后面跟有一个冒号,然后是一个常量表达式指定位数。例如modified 是一个只有一位构成的位域。
在类体中相邻定义的位域,如果可能的话,它们会被放在同一个整数的连续位中,并以此提供空间压缩。例如,在下列声明中5 个位域被存储在单个unsigned int 中,它首先与位域mode 相关联。
class File {
public:
Bit mode: 2;
Bit modified: 1;
Bit prot_owner: 3;
Bit prot_group: 3;
Bit prot_world: 3;
//
};
位域在内存中的位置是从低位向高位放置的,比如mode在Bit的最低两位(二进制数0b0000000000000011中两个1的位置)。
对于位域的访问方式与其他类数据成员相同。例如,类的私有位域只能在类的成员函数和友元中被访问:
{
modified = 1;
//
}
void File::close()
{
if ( modified )
// 内容从略
}
下面的例子说明了怎样使用大于1 位的位域
int main() {
File myFile;
myFile.mode |= READ;
if ( myFile.mode & READ )
cout << "myFile.mode is set to READ\n";
}
通常情况下我们会定义一组inline 成员函数,来测试每个位域成员的值。例如,类File可以定义成员isRead()和isWrite()
inline int File::isWrite() { return mode & WRITE; }
if ( myFile.isRead() ) /**//* */
有了这些成员函数,现在位域可以被声明为类File 的私有成员。
由于取地址操作符& 不能被应用在位域上,所以也没有能指向类的位域的指针。位域也不能是类的静态成员。
C++标准库提供了一个bitset 类模板,它可以辅助操纵位的集合。在可能的情况下应尽可能使用它来取代位域。
C++中的位域(bit-filed):一种节省空间的成员相关推荐
- C++:34---union:联合/共用体,一种节省空间的类
一.联合(union)概述 联合(union)是一种特殊的类 一个union可以有多个数据成员,但是在任意时刻只有一个数据成员可以有值.当我们给union的某个成员赋值之后,该union的其它成员就变 ...
- Oracle中压缩数据节省空间和提高速度
使用表压缩来节省空间并提高查询性能 很多决策支持系统通常都涉及到存储于几个特大表中的大量数据.随着这些系统的发展,对磁盘空间的需求也在快速增长.在当今的环境下,存储着数百TB(太字节)的数据仓库已经变 ...
- C语言中的位域 bit field [转]
一.位域 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位 ...
- 位域 内存 字节序_C语言中的位域、字节序、比特序、大小端(转)
1.比特序 / 位序 / bit numbering / 我们知道一个字节有8位,也就是8个比特位.从第0位到第7位共8位.比特序就是用来描述比特位在字节中的存放顺序的.通过阅读网页的内容,关于比特序 ...
- Redis中五大基本数据类型和三种特殊数据类型详解
目录 介绍 概念 基本命令 redis是单线程的 五大基本数据类型 String 命令 应用场景 List 命令 应用场景 Set 命令 应用场景 Hash 命令 应用场景 Zset 命令 应用场景 ...
- Spring中配置DataSource数据源的几种选择
Spring中配置DataSource数据源的几种选择 在Spring框架中有如下3种获得DataSource对象的方法: 从JNDI获得DataSource. 从第三方的连接池获得DataSourc ...
- jquery判断方法是否存在_判断图中是否有环的三种方法
0.什么是环? 在图论中,环(英语:cycle)是一条只有第一个和最后一个顶点重复的非空路径. 在有向图中,一个结点经过两种路线到达另一个结点,未必形成环. 1.拓扑排序 1.1.无向图 使用拓扑排序 ...
- C#中判断空字符串的3种方法性能分析【月儿原创】
C#中判断空字符串的3种方法性能分析 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/ 时间:2007.4.28 3种方法分别是:string ...
- c语言中的普通字符包括什么,【判断题】C语言中的字符常量通常有两种形式:普通字符和转义字符。...
[判断题]C语言中的字符常量通常有两种形式:普通字符和转义字符. 更多相关问题 ---Can you speak French?---Yes, but only____.A.a littleB.lit ...
最新文章
- 社区智能家居产品研发商西谷数字新三板挂牌上市
- abap submit 的使用方法
- mysql生产环境加索引_【生产篇】_MySQL环境下如何查看基于表的索引定义
- mysql主键unsigned_mysql – 主键应该总是unsigned?
- 连接超时_记一次网络请求连接超时的事故
- 46张PPT彻底弄懂JVM、GC算法和性能调优!
- 数据驱动安全:数据安全分析、可视化和仪表盘》一3.6 本章小结
- Windows 7安装 Visual Studio 2010之大战三大回合
- har后缀文件怎么提取?
- 【Python密度泛函理论】
- win10易升_史上最稳定的win10版本,四大更新内容强势来袭,你敢升级吗?
- 想了解直播系统开发用什么语言?
- PCIe 分类、速度
- html表格填充空白单元格,Excel表格数据录入:怎么快速填充所有空白单元格?
- CentOS之VI编辑器的常用命令
- 高端光刻机为什么那么难制造?
- 计算机组成原理实验logisim(三)之偶校验编码与检错
- 达梦数据库DM的dmap服务启动失败dmap init failed如何解决
- 【第十三届全国大学生数学竞赛非数学类】真就参加就有奖
- android webview加载html图片自适应手机屏幕大小点击查看大图
热门文章
- linux端口爆破软件,Linux网络安全:端口扫描软件 nmap
- Adobe illustrator 抽丝剥茧选中多个点 - 连载 13
- 这些基因的名字太有才了,研究一下都可以发10分文章
- 常用输入法隐藏的这些神奇功能
- centos7 下 sudo yum install 报错镜像找不到
- python常用函数使用方法实例
- Qt笔记-当前时间转GMT并转换成英文(Qt构造http头中Date数据)
- Qt学习笔记-编写简易的音乐播放器
- 3dcaptcha php,php实现的Captcha验证码类实例
- php是阻塞模式吗,PHP非阻塞模式 - 黑白大熊猫的个人空间 - OSCHINA - 中文开源技术交流社区...