struct bitfield max size(C99,C ++)

时间:2010-04-15 16:53:53

标签: c++ c struct c99 bit-fields

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

struct i { long long i:127;}

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

4 个答案:

答案 0 :(得分:20)

C99§6.7.2.1,第3段:

  

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

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

  

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

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

答案 1 :(得分:3)

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

  

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

编辑:

来自C99规范:

6.7.2.1子弹9:

  

位字段被解释为带符号   或由无符号整数类型组成   指定的位数。如果   值0或1存储在a中   类型的非零宽度位字段   _Bool,位字段的值应比较等于该值   存储

6.7.2.1子弹10:

  

实施可以分配任何   可寻址的存储单元足够大   持有一个位域。如果有足够的空间   仍然是一个立即的比特场   跟随a中的另一个位字段   结构应包装成   相同单元的相邻位。如果   空间不足,无论是否   放入不适合的位字段   下一个单位或相邻的重叠   单位是实施定义的。该   比特字段的分配顺序   在一个单位内(从高阶到低阶   或者从低阶到高阶)   实现定义。对齐   可寻址存储单元的   未指定的。