C ++中位字段如何与位填充相互作用

Joh*_* Li 6 c++ memory-layout language-lawyer bit-fields

这里查看此问题的C版本。

当存在填充位时,我有两个关于位字段的问题。

说我有一个结构定义为

struct T { 
    unsigned int x: 1; 
    unsigned int y: 1;
};
Run Code Online (Sandbox Code Playgroud)

结构T仅实际使用了两位。

问题1:这两位始终是基础无符号int的最低有效位吗?还是取决于平台?

问题2:那些未使用的30位是否总是初始化为0?C ++标准对此有何评论?

Sto*_*ica 4

\n

问题 1:这两个位总是底层 unsigned int 的最低有效位吗?或者它依赖于平台?

\n
\n\n

非常依赖平台。该标准甚至有一个注释只是为了澄清多少:

\n\n
\n

[类.位]

\n\n

1 ...类对象内位域的分配是由实现定义的。位域的对齐是由实现定义的。位字段被打包到一些可寻址的分配单元中。[\xe2\x80\x89注意:位域在某些机器上跨接分配单元,而在其他机器上则不然。位域在某些机器上从右到左分配,在其他机器上从左到右分配。\xe2\x80\x89\xe2\x80\x94\xe2\x80\x89尾注\xe2\x80\x89]

\n
\n\n

您不能对位字段的对象布局做出太多假设。

\n\n
\n

问题2:那些未使用的30位总是初始化为0吗?C++ 标准对此有何规定?

\n
\n\n

您的示例有一个简单的聚合,因此我们可以枚举可能的初始化。未指定初始化程序...

\n\n
T t;\n
Run Code Online (Sandbox Code Playgroud)\n\n

...将默认初始化它,使成员具有不确定的值。另一方面,如果您指定空大括号...

\n\n
T t{};\n
Run Code Online (Sandbox Code Playgroud)\n\n

...该对象将被聚合初始化,因此位字段将被初始化为{}自身初始化,并设置为零。但这仅适用于聚合的成员,即位字段。没有指定填充位采用什么值(如果有)。所以我们不能假设它们将被初始化为零。

\n