Почему структура, состоящая из char, short и char (в таком порядке), при компиляции в C ++ с включенной 4-байтовой упаковкой приходит к 6-байтовой структуре?

Я думал, что понимаю, как C / C ++ обрабатывает выравнивание членов структуры. Но я получаю странные результаты для конкретной договоренности в Visual Studio 2008 и 2010.

В частности, я обнаружил, что структура, состоящая из char, short и char, компилируется в 6-байтовую структуру, даже с включенной 4- или 8-байтовой упаковкой. Я в недоумении, почему это так. Я могу понять 4-байтовую структуру. Я мог бы понять 8-байтовую структуру. Но я думаю, что 6-байтовая структура была бы невозможна, если включена 4-байтовая упаковка.

Программа, которая демонстрирует проблему:

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

Выход:

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

Может кто-нибудь объяснить, почему VC дополняет каждый из этих символов дополнительным байтом?

Ответы на вопрос(1)

Ваш ответ на вопрос