Мне показалось, что я понял, как 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 дополняет каждый из этих символов дополнительным байтом?