Реализация и переносимость битового поля C ++ Union / Struct - PullRequest
0 голосов
/ 31 октября 2018

У меня есть объединение, содержащее uint16 и такую ​​структуру:

union pData {
    uint16_t w1;
    struct {
        uint8_t d1 : 8;
        uint8_t d2 : 4;
        bool b1 : 1;
        bool b2 : 1;
        bool b3 : 1;
        bool b4 : 1;
    } bits;
};

Мой коллега говорит, что есть проблема с портативностью, но я не уверен, что куплю это. Могут ли некоторые объяснить (как можно проще), что здесь не так?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Возможно, ваш коллега догадывается, что вы намереваетесь написать в w1 и прочитать из bits или наоборот.

Это было бы неопределенным поведением. В C ++ только один член union может быть активным одновременно; запись члена делает его активным, и поведение чтения неактивного члена не определено.

0 голосов
/ 31 октября 2018

С C++17 12.2.4 Bit-fields /1C++11 9.6 Bit-fields /1 в этом отношении, если вы хотите получить ответ специфический на выбранные вами теги):

Выделение битовых полей внутри объекта класса определяется реализацией. Выравнивание битовых полей определяется реализацией. Битовые поля упакованы в некоторую адресуемую единицу выделения. [Примечание: Битовые поля размещают единицы распределения на некоторых машинах, а не на других. Битовые поля назначаются справа налево на некоторых машинах, слева -направо на других. - конечная нота]

Опора на поведение, определяемое реализацией, по своей природе означает непереносимый код.

...