Warum ergibt eine Struktur aus char, short und char (in dieser Reihenfolge) bei der Kompilierung in C ++ mit aktiviertem 4-Byte-Packing eine 6-Byte-Struktur?

Ich dachte, ich hätte verstanden, wie C / C ++ die Ausrichtung von Strukturelementen handhabt. Ich erhalte jedoch merkwürdige Ergebnisse für ein bestimmtes Arrangement in Visual Studio 2008 und 2010.

Insbesondere stelle ich fest, dass eine Struktur, die aus char, short und char besteht, zu einer 6-Byte-Struktur kompiliert wird, auch wenn das Packen mit 4 oder 8 Byte aktiviert ist. Ich weiß nicht, warum das so ist. Ich kann eine 4-Byte-Struktur verstehen. Ich könnte vielleicht eine 8-Byte-Struktur verstehen. Aber ich würde denken, dass eine 6-Byte-Struktur unmöglich wäre, wenn 4-Byte-Packing aktiviert ist.

Ein Programm, das das Problem demonstriert, ist:

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

Die Ausgabe ist:

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

Kann jemand erklären, warum VC jedes dieser Zeichen mit einem zusätzlichen Byte auffüllt?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage