【发布时间】:2019-10-11 14:32:38
【问题描述】:
类似于c union and bitfields,但在C++ 中并包括对初始序列的访问
类似于Union common initial sequence with primitive,但使用bitfields
我想做的是这样的:
struct A
{
short common : 1;
short a1: 5;
short a2: 8;
};
struct B
{
short common : 1;
short b1: 3;
short b2: 4;
short b3: 6;
};
union C
{
A a;
B b;
};
然后按如下方式使用:
short foo(C data)
{
if (data.a.common)
{
return data.a.a1*data.a.a2;
}
return data.b.b1*data.b.b2*data.b.b3;
}
问题似乎是,如果data.a.common 为假,代码将通过A 的成员将数据集作为B 访问
标准中似乎有关于联合和类似初始序列的语言,但不确定common 是否会被视为bitfield
9.5.1 允许检查任何标准布局结构成员的公共初始序列;
任何澄清将不胜感激
【问题讨论】:
-
联合的大小始终是其最大元素的大小。在您的情况下,它将是 B 的大小,即 8 个字节。这意味着 A 和 B 的所有成员都可以安全访问,但如果您没有将其设置为有意义的值,它可能会产生随机结果。一些编译器用 0 初始化所有内容,但有些则没有。即使那样,优化设置也可能会关闭该功能。如果您能告诉我们您想要达到的目标,将会有所帮助。
-
@Sam A、B 和 C 是 sizeof(short)==2bytes==16 位,有一些浪费
标签: c++ language-lawyer unions bit-fields