gpt4 book ai didi

c - 使用零宽度字段进行位字段对齐

转载 作者:行者123 更新时间:2023-12-04 10:11:26 25 4
gpt4 key购买 nike

在 C 中,可以通过指定一个没有名称的零宽度位域来强制一组位域从相对于它们的前身的新存储单元开始,例如

int field1:10;
int :0;
int field2:5; // will be in a new storage unit

如果声明了两个连续的零宽度字段,是否有定义的行为,例如:

int field1:10;
int :0;
int :0;
int field2:5; // will be in a new storage unit

在查看 C90 和 C99 规范时,我看不到任何明确指定附加字段是否被简单地忽略,或者是否可能导致整个附加存储单元被搁置的内容。

C99 标准说 (§6.7.2.1):

As a special case, a bit-field structure member with a width of 0 indicates that no further bit-field is to be packed into the unit in which the previous bit-field, if any, was placed.

根据我的理解,这是模棱两可的——如果您将 :0 视为“虚拟”位域(尽管不占用任何存储空间),那么可以将上面的内容理解为下一个 :0 不能和上一个打包到同一个(非存储)

我的编译器似乎确实忽略了额外的内容,但我想知道规范是否真的保证了这一点。

最佳答案

无论您是否将零长度位字段算作实际位字段,您都可以说,它总是与它之前的字段放在相同的包装单元中。因为那是它影响的包装单元:它基本上填满了它,所以不能再往里面放更多的位。而且,如果前面的字段已经满了,则虚拟字段没有任何作用。另一方面,虚拟字段不会以任何方式影响后面的打包单元,因为它仍然完全可用以填充位。

因此,您观察到的忽略行为似乎是强制性的:在任何一种情况下,第二个 :0 的前一个字段位于包含最后一个实际字段的包装单元中,独立于前一个字段是否被视为最后一个实际字段,或前面的零长度字段。

话虽如此,这绝对是编写标准的人很可能没有预料到的措辞极端情况,因此其措辞确实不够精确。因此,我不会让一些编译器以另一种方式解释措辞。因此,我建议不要依赖 int :0; 的任何特定行为。 int :0;.

关于c - 使用零宽度字段进行位字段对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37255759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com