领域联合与结构联合之间的区别

时间:2019-05-21 15:25:03

标签: c++ struct union bit-fields

我正在定义一组用于处理某些寄存器的结构,当我定义结构时,我发现定义简单字段的并集与结构的并集之间存在差异。我不确定为什么会发生这种差异:

#include <iostream>

using namespace std;


typedef union
{

    uint16_t all_bits;
    struct
    {   
        uint16_t a:4, b:4, c:4, d:3, e:1;
    };  
}
Example1_t;

typedef union
{

    uint16_t all_bits;
    uint16_t a:4, b:4, c:4, d:3, e:1;

}
Example2_t;

    int 
main ()
{
    Example1_t example1;
    Example2_t example2;
    example1.all_bits = 0x8BCD;
    example2.all_bits = 0x8BCD;

    cout << "a " << std::hex << example1.a << " " << example2.a << std::endl;
    cout << "b " << std::hex << example1.b << " " << example2.b << std::endl;
    cout << "c " << std::hex << example1.c << " " << example2.c << std::endl;
    cout << "d " << std::hex << example1.d << " " << example2.d << std::endl;
    cout << "e " << std::hex << example1.e << " " << example2.e << std::endl;

    return 0;
}

输出:

a d d
b c d
c b d
d 0 5
e 1 1

1 个答案:

答案 0 :(得分:4)

学究的答案是:

您的代码具有未定义的行为。写入并集字段并从另一个字段读取内容并不能保证正常工作,因此,您看到的任何不一致之处都可以作为“破损代码”动摇。

实际上,许多野蛮人依赖于这种“破坏行为”的一致性,以至于所有现代编译器仍在此处提供可预测的功能(以忽略一些优化机会为代价)。因此,确实在您的代码中有一些特定的东西使它按其行为方式运行:

Example1_t中,联合具有两个重叠的字段:all_bits和struct。在该结构中,每个成员都有不同的存储。

Example2_tabcde中,联合都是单独的字段,因此它们都具有重叠的存储空间。