Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

246
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda