Ausrichtung der Struktur in Visual C++

Visual C++ bietet sowohl einen compiler-Schalter (/Zp) und die pack pragma Einfluss auf die Ausrichtung in Ordnung struct Mitglieder. Jedoch, mir scheint, ich habe einige Missverständnis, wie Sie arbeiten.

Laut MSDN, für einen gegebenen Werte n,

Die Ausrichtung eines Mitglieds wird auf eine Grenze, die entweder aus einer
Vielfaches von n oder ein Vielfaches von der Größe der Mitgliedstaaten, wobei
kleiner.

Lassen Sie uns annehmen, pack den Wert 8 bytes (das ist die Standardeinstellung). Innerhalb einer struct, würde ich denken, dass jedes Mitglied, dessen Größe weniger als 8 bytes werden bei einem offset, der ein Vielfaches seiner eigenen Größe. Jedes Mitglied, dessen Größe von 8 bytes oder mehr wird ein offset, der ein Vielfaches von 8 bytes.

Nehmen Sie nun das folgende Programm:

#include <tchar.h>

#pragma pack(8)

struct Foo {
    int i1;
    int i2;
    char c;
};

struct Bar {
    char c;
    Foo foo;
};

int _tmain(int argc, _TCHAR* argv[]) {
    int fooSize = sizeof(Foo); //yields 12
    Bar bar;
    int fooOffset = ((int) &bar.foo) - ((int) &bar); //yields 4

    return 0;
}

Den Foo Struktur ist 12 Byte groß sind. Also innerhalb Bar, würde ich erwarten, dass die Foo Mitglied werden bei offset 8 (Vielfaches von 8), während tatsächlich es ist an offset 4. Warum ist das so?

Auch Foo wirklich nur 4+4+1 = 9 bytes of data. Der compiler fügt automatisch padding bytes am Ende. Aber wieder, angesichts ein alignment-Wert von 8 bytes ist, sollte es nicht pad wird ein Vielfaches von 8 statt 4?

Jede Klärung dankbar!

  • Sind Sie sicher, dass Ihre int ist nur 4 bytes? In welcher Maschine Sie diese auf?
  • Es ist eine 32 bit-Anwendung. Wenn ein int mit 8 Byte statt 4, ein Foo mit zwei von denen konnte nicht gut sein, nur 12 Byte. 🙂
InformationsquelleAutor Daniel Wolf | 2012-04-21
Schreibe einen Kommentar