原理
bit_vector容器具有vector容器一样的成员西数,常用于硬件端口的控制。区别于vector的一个重要特征是bit_vector更节省内存空间,一个元素只占用一个bit ,而不是一个字节。
bit_vector容器的每个元素是一个bit位值,取0或1,连续分配在以字为单位的字节块中,如图所示,13个bit分别为1011010100010,占用了一个字的内存空间。一个字为2个字节大小,共有16个bit 。
bit_vector容器的实现,首先需要解决若干bit位的内存分配和迭代器对bit位元素的随机读写问题。bit 位的内存分配,由内存分配器根据 bit 位的个数需求,一次性地分配若干字,以后通过动态分配内存进行bit位的添加。随机访问迭代器,通过所在的字和位的偏移给出一个 bit 位的确切位置。bit 位的随机读写,利用C++的bit位操作运算,如位与、位或和异或等,判断某个bit位值为1或0,或设置某个bit位为1或0。
如图所示,假设为bit位分配了连续的3个机器字的空间,共6个字节,16×3=48个 bit。为了对灰色的 bit 位进行读写,Bit_reference 结构体使用了一个标志 bit 位所在字的M_p指针变量,它的类型为unsigned int*,正好作为一个字的指针类型。此外,还使用一个M_mask变量,标记bit位在这个字中的偏移量。对于图所示的情形,M_p指向灰色bit位所在的第2个字,M_mask为00100000