разница между объединением полей и объединением структур - PullRequest
2 голосов
/ 21 мая 2019

Я определяю группу структур для обработки некоторых регистров, и когда я определил структуры, я обнаружил эту разницу между определением объединения простых полей и объединения структур.Я не уверен, почему это различие происходит:

#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;
}

ВЫХОД:

add
bcd
cbd
d 0 5
e 1 1

1 Ответ

4 голосов
/ 21 мая 2019

педантичный ответ:

Ваш код имеет неопределенное поведение.Запись в поле объединения и чтение из другого не гарантируется, поэтому любое несоответствие, которое вы видите, может быть удалено вручную как "неработающий код".

В действительности , так много людей вдикие полагаются на то, что это «нарушенное поведение» является непротиворечивым, что все современные компиляторы все еще обеспечивают предсказуемую функциональность здесь (за счет игнорирования некоторых возможностей оптимизации).Так что в вашем коде действительно есть что-то конкретное, что заставляет его вести себя так, как он делает:

В Example1_t объединение имеет два перекрывающихся поля: all_bits и структура.Внутри этой структуры каждый член имеет отдельное хранилище.

В Example2_t, a, b, c, d и e являются отдельными полями объединения, поэтому ониу всех есть перекрывающееся хранилище.

...