当前,我正在使用位字段来表示c ++中的标志寄存器:
struct DEVICE_REGISTER {
unsigned ready:1; // 1 if device is ready
unsigned error:1; // 1 if an error occurred.
unsigned bus_address:4; // up to 16 possible drives on bus
unsigned command:2; // up to 4 different commands
unsigned error_code:8;
};
执行按位操作是干净,容易和直观的:
{
dev_reg->bus_address = 1;
dev_reg->command = CmdReset;
/* wait until operation done, ready will be true */
while ( ! dev_reg->ready ) ;
/* check for errors */
if (dev_reg->error)
{ /* interrogate disk_reg->error_code for error type */
switch (dev_reg->error_code)
......
}
}
但是,我想使用STL的bitset<>
来提高效率,但是我找不到如何将位段声明为按名称引用的数据字段的方法。以下显然不起作用:
struct DEVICE_REGISTER {
bitset<1> ready; // 1 if device is ready
bitset<1> error; // 1 if an error occurred.
bitset<4> bus_address; // up to 16 possible drives on bus
bitset<2> command; // up to 4 different commands
bitset<8> error_code;
};
if (dev_reg->error_code)
dev_reg->error_code = 0; // clear the error codes
dev_reg->error = 0;
resend(dev_reg); // resend the register
};
如果bitset<>
不支持此功能,那么我很难看到使用它的真正好处。在拥有更紧凑的数据结构的过程中,您将损失代码量,复杂性,可读性和可靠性。根据值的位置和大小而不是命名字段来引用值很容易发生人为错误,并且需要大量代码体操。