Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

243
Vistas
Problemas al leer el tamaño de la estructura

Si depuro el siguiente código, veo que el valor del size es 12 (como se esperaba).

 #include <cstdint> int main(int argc, char *argv[]) { typedef struct __attribute__((__packed__)) { int8_t value; } time; typedef struct __attribute__((__packed__)) { uint8_t msg[8]; // time t1; uint32_t count; } theStruct; theStruct s; int size = sizeof(s); return 0; }

Curiosamente, al eliminar el comentario en "tiempo t1;", el valor de size pasa a 16. Esperaba 13.

Sé (más o menos) que esto se explica por la historia del relleno de la estructura de datos...

Pero, ¿hay alguna forma de evitar este problema? ¿Qué hacer para leer size = 13 ?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Hay algunos problemas con la emulación de empaquetado de estructuras MSVC de MinGW.

La solución consiste en pasar -mno-ms-bitfields al compilador; esto hará que use su propio algoritmo de diseño en lugar de intentar emular MSVC.

Consulte también Empaquetado y alineación de estructuras con mingw (ARM, pero puede ser el mismo problema).

over 4 years ago · Santiago Trujillo Denunciar

0

Es claramente un problema de alineación, lo que significa que no tiene nada que ver con el lenguaje en sí, sino con la plataforma subyacente.

Si la plataforma sabe (o piensa) que int32_t necesita una alineación de 4, debe agregar 3 bytes de relleno después de un tiempo.

De todos modos __attribute__((__packed__)) no es C estándar y solo será interpretado por gcc (*). Peor aún, conduce a programas no portátiles: de acuerdo con esta respuesta en otra pregunta, causaría un error de bus en una arquitectura Sparc debido a un int32_t desalineado.

Sé que la arquitectura x86 (y sus derivados) son ahora las más comunes, pero aún pueden existir otras arquitecturas...

(*) según el equivalente de Visual C++ del __attribute__ de GCC ((__packed__)) , el equivalente de MSVC es #pragma pack(push, 1)

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda