16

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

struct i { long long i:127;}

我可以在 struct 中定义一个位域,位域的大小最多为 128 位、256 位或更大吗?有一些超宽向量类型,如 sse2(128 位)、avx1/avx2(256 位)、avx-512(下一个 Xeon Phis 为 512 位)寄存器;还有像gcc 中的__int128这样的扩展。

4

4 回答 4

23

C99 §6.7.2.1,第 3 段:

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

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

... 常量表达式应该是一个整数常量表达式,其值大于或等于零。整数常量表达式的值可能大于位域类型的对象表示(3.9)中的位数;在这种情况下,额外的位被用作填充位并且不参与位域的值表示(3.9)

所以在 C 中你根本不能这样做,而在 C++ 中它不会做你想做的事。

于 2010-04-15T19:52:13.777 回答
3

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

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

我想这可以用来表示某种最大尺寸。

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

于 2010-04-15T17:12:01.003 回答
2

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

于 2010-04-15T17:14:34.277 回答
1

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

编辑:

来自 C99 规范:

6.7.2.1 项目符号 9:

位域被解释为由指定位数组成的有符号或无符号整数类型。如果值 0 或 1 存储到 _Bool 类型的非零宽度位域中,则该位域的值应与存储的值进行比较。

6.7.2.1 项目符号 10:

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

于 2010-04-15T17:16:28.213 回答