struct bitfield max size(C99,C ++)

位结构字段的最大位宽是多少?

struct i { long long i:127;} 

我可以在struct中定义一个位域,位域大小可以达到128位,或者是256位,还是更大? 有一些超宽的矢量类型,如sse2(128位),avx1 / avx2(256位),avx-512(下一个Xeon Phis为512位)寄存器; 以及gcc中的__int128等扩展名。

C99§6.7.2.1,第3段:

指定位字段宽度的表达式应为整数常量表达式,其具有非负值, 如果省略冒号和表达式,则该非负值不得超过指定类型的对象中的位数 。 如果该值为零,则声明不应具有声明者。

C ++0xa§9.6,第1段:

… constant-expression应为具有大于或等于零的值的整数常量表达式。 积分常数表达式的值可能大于位域类型的对象表示(3.9)中的位数; 在这种情况下,额外比特用作填充比特,并且不参与比特字段的值表示(3.9)

所以在C中你完全不能这样做,而在C ++中它不会做你想要的。

C ++标准对位域的大小没有限制,除了它必须大于或等于零 – 第9.6 / 1节。 它还说:

比特字段被打包到一些可寻址的分配单元中。 [注意:位字段跨越某些机器上的分配单元而不是其他机器上的分配单元。 在某些机器上从右到左分配位字段,在其他机器上从左到右分配。 ]

我认为可以指出某种最大尺寸。

当然,这并不意味着您的特定编译器实现支持任意大小的位字段。

通常,您不能分配比基础类型更多的位。 如果long long是64位,那么你的位域可能限于:64。

由于位字段的值被赋值为整数,我假设您可以使用的最大位字段值是intmax_t的大小。

编辑:

来自C99规格:

6.7.2.1子弹9:

位字段被解释为由指定位数组成的有符号或无符号整数类型。 如果将值0或1存储到_Bool类型的非零宽度位字段中,则位字段的值应等于存储的值。

6.7.2.1子弹10:

实现可以分配足够大的任何可寻址存储单元来保持位字段。 如果剩余足够的空间,则紧跟在结构中的另一个位字段之后的位字段将被打包到相同单元的相邻位中。 如果剩余的空间不足,则是否将不适合的位域放入下一个单元或重叠相邻单元是实现定义的。 单元内的位域分配顺序(高阶到低阶或低阶到高阶)是实现定义的。 未指定可寻址存储单元的对齐。