Hoy en día, con mi gran sorpresa, descubrí queC/C++ conseguir el tamaño struct
Cuando se aplica el operador sizeof a una clase, estructura o tipo de unión, el resultado es el número de bytes en una objeto de ese tipo, más cualquier relleno añadido para alinear miembros en límites de palabras. El resultado no se corresponde necesariamente con el tamaño calculado al agregar los requisitos de almacenamiento de los miembros individuales.
que no sabía de él, y estoy bastante seguro de que esta cosa se está rompiendo algunos de mi viejo código: leer archivos binarios que solía tener estructuras como ésta:
struct Header
{
union {
char identc[4];
uint32 ident;
};
uint16 version;
};
ya leer los 6 bytes directamente con fread
impulsado por sizeof
:
fread(&header, sizeof(header), 1, f);
Pero ahora vuelve sizeof(header)
8
!
¿Es posible que con versiones anteriores del CCG sizeof(header)
regresaron 6
, o que mi mente está totalmente desaparecido?
De todos modos, ¿hay algún otro operador (o directiva de preprocesador o lo que sea) que le permita al compilador saber qué tan grande es la estructura, sin incluir el relleno?
De lo contrario, ¿cuál sería una forma limpia de leer una estructura de datos sin procesar desde un archivo que no requiere escribir demasiado código?
EDITAR: Sé que esta no es la forma correcta de leer/escribir datos binarios: Tendría resultado diferente dependiendo de endianess máquina y esas cosas. De todos modos, este método es el más rápido, estoy tratando de leer algunos datos binarios para obtener rápidamente su contenido, no para escribir una buena aplicación que voy a utilizar en el futuro o para lanzar.
posible duplicado de [¿Por qué no es sizeof para una estructura igual a la suma de sizeof de cada miembro?] (Http://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct -equal-a-la-suma-de-tamaño-de-cada-miembro) – cdhowie
solo una observación: el estándar-C tampoco permite miembros 'union' sin nombre; también, los tipos estándar de tamaño fijo (declarados en 'stdint.h') se llaman' uint32_t' y 'uint16_t' – Christoph
Sería útil citar de dónde vino su cita. ¿Es esto de un estándar reciente? – beldaz