de trabajo en C11, la siguiente estructura:Un error en la aplicación GCC de campos de bits
struct S {
unsigned a : 4;
_Bool b : 1;
};
consigue organizada por GCC como un unsigned
(4 bytes) de los que se utilizan 4 bits, seguido de un _Bool
(4 bytes) de los cuales se usa 1 bit, para un tamaño total de 8 bytes.
Tenga en cuenta que C99 y C11 permiten específicamente _Bool
como miembro de campo de bits. El estándar C11 (C99 y probablemente también) También Unidos bajo §6.7.2.1 'Estructura y unión especificadores' ¶ 11 que:
Una implementación puede asignar cualquier unidad de almacenamiento direccionable lo suficientemente grande como para contener un campo de bits. Si queda suficiente espacio, un campo de bits que sigue inmediatamente a otro campo de bits en una estructura debe empaquetarse en los bits adyacentes de la misma unidad.
Así que creen que el miembro de b
anteriormente debería haber sido embalado en la unidad de almacenamiento asignado para el miembro a
, resultando en una estructura de tamaño total de 4 bytes.
GCC se comporta correctamente y el embalaje se produce cuando se utilizan los mismos tipos de los dos miembros, o cuando uno es unsigned
y el otro signed
, pero los tipos unsigned
y _Bool
parecen estar considerado demasiado distinta por GCC para que pueda manejarlos correctamente.
¿Alguien puede confirmar mi interpretación de la norma, y que esto es de hecho una falla de GCC?
También estoy interesado en una solución temporal (algunos modificador del compilador, pragma, __attribute__
...).
estoy usando gcc 4.7.0 con -std=c11
(aunque otras configuraciones muestran el mismo comportamiento.)
Tenga en cuenta que la extensión GCC '__attribute__ ((packed))' se puede aplicar a los miembros aquí , pero es ortogonal a este problema (resulta en una estructura de tamaño 4 + 1 = 5, es decir, con el mismo problema). – ndkrempel
Relacionados: http://stackoverflow.com/questions/308364/c-bitfield-packing-with -bools (pero se refiere a C++, que no es tan exacto en su redacción en campos de bits.) – ndkrempel
Según una respuesta a la pregunta vinculada anteriormente, este comportamiento no se produjo en gcc 4.2.4, por lo que puede ser una regresión desde entonces. – ndkrempel