Intereting Posts

c объединение и битовые поля

Можно ли использовать битовые поля в союзе?

    Да, они могут быть. Почему бы и нет? Бит-поля в объединениях ведут себя так же, как они ведут себя в другом месте. Нет ничего особенного в битовых полях в объединениях (или объединениях с битовыми полями).

    Да, возможно, но я бы рекомендовал против него. Длина и упаковка битполей не переносимы. Размер союза будет трудно предсказать (см. Здесь ). Существует определенная сложность, которую вы вводите в код при использовании объединений или битовых полей. Хотя эта сложность может быть приемлемой в вашем коде, объединение этих двух может привести к неприемлемой сложности. Если вы используете союзы, структуры и битовые поля, у вас возникают проблемы с выравниванием памяти.

    Если это кодовый код, который нужно только построить и запустить на одной машине, то это, вероятно, хорошо. Однако, если вы проверяете это на контроль версий, где он будет жить вечно, я рекомендую против него.

    Если вы дадите пример того, почему вы хотите это сделать, я или кто-то другой может предложить лучшую альтернативу.

    EDIT: уточняется на основе комментариев и запрашивать отзывы.

    Если вы думаете о том, как работает профсоюз, у вас есть ответ, который, конечно, да (почему бы и нет)? Как мы и ожидаем, союз достаточно велик, чтобы удерживать наибольшее значение, и поэтому автоматически становится меньше. Битовые поля упаковываются в «контейнеры», и компилятор должен иметь возможность оценить их окончательный реальный размер. Ниже приведены некоторые интересные факты (и, конечно, неправильное использование союза, но не для присутствия битового поля!)

    #include  union test { int a:5; int b:12; float c; double d; int x; }; int main() { union test x; printf("%d\n", sizeof(x)); xa = 31; printf("%d\n", xa); printf("%d\n", xb); xc = 1.23; printf("%d\n", xa); printf("%f\n", xc); xx = 31; printf("%d\n", xx); printf("%d\n", xa); printf("%d\n", xb); } 

    Это небезопасно, если вы пишете один элемент union и читаете его с другого. Если детали вашей реализации гарантируют, что этого не произойдет, то объединение, содержащее битподобный (и, предположительно, другие члены), имеет четкое, безопасное поведение.