¿Por qué una estructura que consiste en un char, short y char (en ese orden), cuando se compila en C ++ con el empaquetado de 4 bytes habilitado, llega a una estructura de 6 bytes?

Pensé que entendía cómo C / C ++ manejaba la alineación de miembros de estructura. Pero obtengo resultados extraños para un arreglo particular en Visual Studio 2008 y 2010.

Específicamente, estoy descubriendo que una estructura que consiste en un char, short y char se compila en una estructura de 6 bytes, incluso con el empaquetado de 4 u 8 bytes habilitado. No sé por qué esto sería así. Puedo entender una estructura de 4 bytes. Quizás podría entender una estructura de 8 bytes. Pero creo que una estructura de 6 bytes sería imposible cuando el empaquetado de 4 bytes esté habilitado.

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;
}

El resultado 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 . . .

¿Alguien puede explicar por qué VC está rellenando cada uno de esos caracteres con un byte adicional?

Respuestas a la pregunta(3)

Su respuesta a la pregunta