具有别名的可变大小的位域

Gun*_*iez 1 c++ bit-fields

我有一些结构包含一个位域,其大小可能会有所不同.例:

struct BitfieldSmallBase {
    uint8_t a:2;
    uint8_t b:3;
    ....
}

struct BitfieldLargeBase {
    uint8_t a:4;
    uint8_t b:5;
    ....
}
Run Code Online (Sandbox Code Playgroud)

和一个联合访问所有位一次:

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;
Run Code Online (Sandbox Code Playgroud)

问题是:对于某些位域基类,uint8_t是不够的.BitfieldSmall确实适合uint8_t,但BitfieldLarge不适合.数据需要尽可能紧密地打包(稍后将由SSE指令处理),因此总是使用uint16_t是不可能的.有没有办法用整数类型声明"all"字段,其大小与位域相同?或者另一种方式来访问整个位?

我当然可以放弃使用模板并明确声明每种位域,但我想避免代码重复(有很多运算符和成员函数列表).

Joh*_*ica 5

您也可以将积分类型设为模板参数.

template<typename T, typename U>
union Bitfield 
{
    T bits;
    U all;
}

typedef Bitfield<BitfieldSmallBase, uint8_t>  BitfieldSmall;
typedef Bitfield<BitfieldLargeBase, uint16_t> BitfieldLarge;
Run Code Online (Sandbox Code Playgroud)