【问题标题】:Is accessing bitfield unions common initial data undefined behavior in C++ standards访问位域联合 C++ 标准中常见的初始数据未定义行为
【发布时间】: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


【解决方案1】:

the definition of common initial sequence:

两种标准布局结构 ([class.prop]) 类型的公共初始序列是按声明顺序排列的最长的非静态数据成员和位字段序列,从每个结构中的第一个此类实体开始,使得相应的实体具有布局兼容的类型,或者两个实体都使用 no_unique_address 属性([dcl.attr.nouniqueaddr])声明,或者两者都不是,或者两个实体都是具有相同宽度的位字段,或者都不是位-字段。

struct Astruct B 的共同初始序列由第一个位域common 组成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-12
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 2014-11-08
    相关资源
    最近更新 更多