c union и битовые поля - PullRequest
       43

c union и битовые поля

9 голосов
/ 21 июня 2010

Могут ли битовые поля использоваться в объединении?

Ответы [ 4 ]

8 голосов
/ 21 июня 2010

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

2 голосов
/ 21 июня 2010

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

#include <stdio.h>

union test {
  int a:5;
  int b:12;
  float c;
  double d;
  int x;
};

int main()
{
  union test x;
  printf("%d\n", sizeof(x));
  x.a = 31;
  printf("%d\n", x.a);
  printf("%d\n", x.b);
  x.c = 1.23;
  printf("%d\n", x.a);
  printf("%f\n", x.c);
  x.x = 31;
  printf("%d\n", x.x);
  printf("%d\n", x.a);
  printf("%d\n", x.b);
}
2 голосов
/ 21 июня 2010

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

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

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

РЕДАКТИРОВАТЬ: уточнено на основе комментариев и запросить обратную связь.

0 голосов
/ 21 июня 2010

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

...