位结构字段的最大位宽是多少?
struct i { long long i:127;}
我可以在struct中定义一个位字段,位域大小最多为128位,或者是256位还是更大?有一些超宽的矢量类型,如sse2(128位),avx1 / avx2(256位),avx-512(512位用于下一个Xeon Phis)寄存器;以及gcc中的__int128等扩展程序。
答案 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中的另一个位字段 结构应包装成 相同单元的相邻位。如果 空间不足,无论是否 放入不适合的位字段 下一个单位或相邻的重叠 单位是实施定义的。该 比特字段的分配顺序 在一个单位内(从高阶到低阶 或者从低阶到高阶) 实现定义。对齐 可寻址存储单元的 未指定的。