¿Por qué una estructura que consiste en un char, short, y carbón de leña (en ese orden), cuando se compila en C ++ con el embalaje de 4 bytes habilitadas, llegado a una estructura de 6 bytes?

StackOverflow https://stackoverflow.com/questions/3638317

Pregunta

creí comprender cómo C / C ++ manejado alineación miembro struct. Pero me estoy resultados extraños para una disposición particular en Visual Studio 2008 y 2010.

En concreto, estoy encontrando que una estructura que consiste en un char, short, y la carbonilla se compila en una estructura de 6 bytes, incluso con el embalaje de 4 u 8 bytes permitido. Estoy en una pérdida de por qué esto sería. Puedo entender una estructura de 4 bytes. Yo quizá podría entender una estructura de 8 bytes. Pero yo creo que una estructura de 6 bytes sería imposible cuando está activado el embalaje de 4 bytes.

Un programa que demuestra el problema es:

#include <iostream>
using namespace std;

#pragma pack (4)

struct Alignment
{
 char c1;
 short s;
 char c2;
};

#define REPORT_VAR_POSITION( structName, varName ) cout << "Member '" << #varName << "' sits at byte # " << offsetof( structName, varName ) << "." << endl;

int main(int argc, char* argv[])
{
 cout << "Sizeof struct Alignment is " << sizeof( Alignment ) << " bytes." << endl;
 REPORT_VAR_POSITION( Alignment, c1 );
 REPORT_VAR_POSITION( Alignment, s );
 REPORT_VAR_POSITION( Alignment, c2 );

 system( "pause" );

 return 0;
}

La salida es:

Sizeof struct Alignment is 6 bytes.
Member 'c1' sits at byte # 0.
Member 's' sits at byte # 2.
Member 'c2' sits at byte # 4.
Press any key to continue . . .

Puede alguien explicar por qué VC es rellenar cada uno de esos caracteres con un byte adicional?

¿Fue útil?

Solución

la documentación de MSDN para #pragma pack (donde n es el valor que estableció):

  

La alineación de un miembro será en un límite que es ya sea un múltiplo de n o un múltiplo del tamaño del miembro, lo que sea menor.

sizeof(short) es de dos bytes, que es menor que el valor de embalaje de cuatro bytes que se establece, por lo que el miembro de short está alineado con un límite de dos bytes.

El último char (c2) es rellenada con un byte adicional después de manera que cuando los objetos Alignment se colocan en una matriz, el elemento short está todavía correctamente alineado en un límite de dos bytes. elementos de la matriz son contiguas y no puede haber ningún relleno entre ellos, así que el relleno se debe añadir al final de la estructura con el fin de asegurar una alineación correcta en arrays.

Otros consejos

Al parecer, que de hecho se entienden mal. En Visual Studio no puede aumento los requisitos de alineación de miembros de la estructura de cualquier tipo mediante el uso de la configuración de embalaje estructura. Sólo se puede disminución ellos.

Si su struct consiste en char (alineado en 1 byte límite) y short (alineado en 2 límite de byte) objetos, a continuación, utilizando 4 y 8 bytes configuración de embalaje tendrá absolutamente ningún efecto en el diseño o el tamaño de su estructura . El resultado será exactamente el mismo que con el embalaje de 2 bytes. La estructura tendrá tamaño de 6 bytes.

La configuración sólo embalaje que tendrá ningún efecto en este caso es el ajuste de embalaje 1-byte que será disminución el requisito de alineación de short de 2 a 1 y el resultado en 4 tamaño en bytes de la estructura.

compilador de C El Visual Studio con esta opción de comando / Zp [n], donde una estructura está lleno de un n -byte límite, aquí es donde la directiva #pragma pack entra, miembros de la estructura son alineados en un límite que es múltiplo de n.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top