Warum wird ein struct eines char besteht, kurz, und char (in dieser Reihenfolge), wenn sie in C ++ kompiliert mit 4-Byte-Pack aktiviert ist, kommen zu einem 6-Byte-Struktur?

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

Frage

Ich dachte, ich verstand, wie C / C ++ struct Mitglied Ausrichtung behandelt. Aber ich bin immer seltsame Ergebnisse für eine bestimmte Anordnung in Visual Studio 2008 und 2010.

Insbesondere ist ich festgestellt, dass eine Struktur eines char, short aus, und Saibling in eine Struktur 6-Byte kompiliert wird, auch mit 4- oder 8-Byte-Verpackung freigegeben. Ich bin ratlos, warum dies sein würde. 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 sein würde, wenn 4-Byte-Verpackung aktiviert ist.

Ein Programm, das das Problem veranschaulicht 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 lautet:

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 mir jemand erklären, warum VC jedes dieser Zeichen mit einem zusätzlichen Byte padding?

War es hilfreich?

Lösung

die MSDN-Dokumentation für #pragma pack (wobei n ist der Wert, den Sie eingestellt):

  

Die Ausrichtung eines Mitglieds an einer Grenze sein, die entweder ein Vielfaches von n ist oder ein Vielfaches der Größe des Bauteils, je nachdem, was kleiner ist.

sizeof(short) sind zwei Bytes, das kleiner ist als der Verpackungswert von vier Bytes, die man festgelegt, so dass das short Element auf eine zwei-Byte-Grenze ausgerichtet ist.

Die letzte char (c2) ist aufgefüllt mit einem zusätzlichen Byte, nachdem es so, dass, wenn Alignment Gegenstände in einem Array angeordnet sind, wird das Element short noch korrekt ausgerichtet auf einer Zwei-Byte-Grenze. Array-Elemente zusammenhängend sind, und es kann sein, keine Polsterung zwischen ihnen, so padding an das Ende der Struktur hinzugefügt werden, um die richtige Ausrichtung müssen in Arrays zu gewährleisten.

Andere Tipps

Offensichtlich falsch verstehen Sie es tatsächlich. In Visual Studio können Sie nicht Anstieg die Ausrichtungsanforderungen für Strukturkomponenten jeder Art durch die Struktur Verpackung Einstellungen. Sie können nur Abnahme sie.

Wenn Sie Ihre Struktur von char besteht (bei 1-Byte-Grenze ausgerichtet) und short (ausgerichtet auf 2-Byte-Grenze) Objekte, dann unter Verwendung von 4- und 8-Byte-Pack Einstellungen haben absolut keinen Einfluss auf die Gestaltung und die Größe Ihrer Struktur . Das Ergebnis wird genau die gleiche wie mit 2-Byte-Verpackung. Die Struktur wird eine Größe von 6 Byte hat.

Die einzige Verpackung Einstellung, die eine Wirkung haben in diesem Fall wird eine 1-Byte-Pack Einstellung die wird Abnahme die Ausrichtungsanforderung von short 2 bis 1 und das Ergebnis in 4-Byte-Größe der Struktur.

Die Visual Studio C-Compiler mit dieser Befehlsoption / Zp [n], wobei eine Struktur auf eine gepackte ist n -Byte Grenze, das ist, wo die #pragma pack Richtlinie kommt, die Mitglieder der Struktur sind ausgerichtet auf einer Grenze, die mehrere von n ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top