【发布时间】:2009-10-01 11:58:36
【问题描述】:
我有一些包含位域的结构,其大小可能会有所不同。示例:
struct BitfieldSmallBase {
uint8_t a:2;
uint8_t b:3;
....
}
struct BitfieldLargeBase {
uint8_t a:4;
uint8_t b:5;
....
}
和一个联合来一次访问所有位:
template<typename T>
union Bitfield
{
T bits;
uint8_t all; // <------------- Here is the problem
bool operator & (Bitfield<T> x) const {
return !!(all & x.all);
}
Bitfield<T> operator + (Bitfield<T> x) const {
Bitfield<T> temp;
temp.all = all + x.all; //works, because I can assume no overflow will happen
return temp;
}
....
}
typedef Bitfield<BitfieldSmallBase> BitfieldSmall;
typedef Bitfield<BitfieldLargeBase> BitfieldLarge;
问题是:对于某些位域基类,uint8_t 是不够的。 BitfieldSmall 确实适合 uint8_t,但 BitfieldLarge 不适合。数据需要尽可能紧密地打包(稍后将由 SSE 指令处理),因此始终使用 uint16_t 是没有问题的。有没有办法用整数类型声明“全部”字段,其大小与位域相同?还是以其他方式访问整个位?
我当然可以放弃使用模板并明确声明每种位域,但我想避免代码重复(有很多运算符和成员函数)。
【问题讨论】:
标签: c++ bit-fields