C++中的位域以及实现一个抽象位域类

March 17, 2017 at 11:52 am

这里说的位域(bit-field)是C/C++语言中的一个概念,它用来为struct/class/union中的成员指定特定的以位为单位的尺寸。之所以要写这个,是因为今天看到了一个位域类的实现,这个类似乎能更方便的使用位域,那就看看它到底如何实现的,顺道把位域复习一遍。说实话在实际项目中没有写过位域,一方面除了C/C++语言,一般的语言都没有这个特性;另一方面,位域在一般的项目中使用较少,仅会出现在偏底层的一些代码中。似乎偶尔在面试中会有关于位域的题目,有段时间学习过一下,不过现在也基本上忘光了,博客也好久没更了,暂时就先补上这一篇。 本文主要有如下几个内容: 1. 位域的基本概念 2. 位域内存占用和pack 3. 实现一个抽象位域类 位域的基本概念 位域通常用于代替一些位操作,典型的使用场景比如占1至2个比特的标记位,如果直接使用bool来定义这个标记位,将会浪费内存空间,32个只有true/false的标记位使用位域只需要4字节,而如果全部定义为bool则需要32个字节;一个典型的方法是将这32个标记位用一个32位的整数表示,每个标记位通过对这个整数的位操作来代替,从功能上来说,位域只是对于代码编写者(阅读者)而言比位操作更加直观一点的方式,通常来讲CPU并没有对特定位进行操作的指令,所以位域操作最终仍会被编译器转化为底层的位操作指令。 如果不需要考虑到内存空间的浪费,或者已经习惯对数字的位操作,那么位域并不是必须的。 下面给出一个最简单的位域的例子(例子引用自 http://en.cppreference.com/w/cpp/language/bit_field): #include <iostream> struct S { // three-bit […]