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

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

9
задан ctuffli 29 June 2011 в 12:23
поделиться

4 ответа

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

8
ответ дан 2 November 2019 в 23:59
поделиться

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

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

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

РЕДАКТИРОВАТЬ: поясняется на основе комментариев и для запроса обратной связи.

2
ответ дан 2 November 2019 в 23:59
поделиться

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

0
ответ дан 2 November 2019 в 23:59
поделиться

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

#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
ответ дан 2 November 2019 в 23:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: