Tengo una struct de la siguiente manera.
struct A { uint32_t a : 1; uint32_t b : 1; }; ¿ struct A está garantizada por el estándar para tener tamaño 4? ¿Es posible que un compilador use solo un byte para la struct A ya que usa exactamente dos bits?
struct B { uint32_t a : 1; uint32_t b : 1; uint32_t c : 30; } b; Si me gustaría establecer los campos de bits en b en cero, ya que sizeof(struct B) = 4 , me parece bien hacerlo por *(uint32_t*)&b = 0 . Pero vi muchas discusiones sobre SO argumentando que tal puntero es una mala práctica. Me pregunto qué hace que *(uint32_t*)&b = 0 sea malo aquí y qué debo hacer (sé que puedo usar memset para restablecer los campos de bits, pero estoy interesado en otras formas portátiles).
La primera pregunta, puede agregar una alineación, pero esto afectará la eficiencia de ejecución:
#pragma pack(push) #pragma pack(1) struct A { uint32_t a : 1; uint32_t b : 1; }; #pragma pack(pop)La segunda pregunta, puedes definirla como unión.
union B { struct { uint32_t a : 1; uint32_t b : 1; uint32_t c : 30; }; uint32_t u; } b; // set the bitfields in b to zero bu = 0;¿
struct Aestá garantizada por el estándar para tener tamaño 4?
No. Puede ser talla 4, puede que no.
¿Es posible que un compilador use solo un byte para la estructura A ya que usa exactamente dos bits?
Sí, es posible .
Me pregunto qué hace que
*(uint32_t*)&b = 0sea malo aquí...
b .uint32_t puede no existir.... y lo que debo hacer
Para poner a cero b , asigne una struct B que sea cero. Investiga el literal compuesto . Tenga en cuenta que este código a continuación se aplica a varios tipos, no solo a struct con campos de bits .
b = (struct B){0};O tal vez, si desea un valor distinto de cero:
b = (struct B){.a = 0, .c = 42, .b = 1}; Los campos de bits son complicados. Use signed int unsigned int y _Bool y no uint32_t para una portabilidad máxima.
Un campo de bits debe tener un tipo que sea una versión calificada o no calificada de
_Bool,signed intunsigned into algún otro tipo definido por la implementación. Está definido por la implementación si se permiten tipos atómicos. C17dr § 6.7.2.1 5