Frage

Bedenken Sie:

struct mystruct_A
{
   char a;
   int b;
   char c;
} x;

struct mystruct_B
{
   int b;
   char a;
} y;

Die Größen der Strukturen sind 12 bzw. 8.

Sind diese Strukturen aufgefüllt oder verpackt?

Wann ist Klotzen oder Verpackung statt?

War es hilfreich?

Lösung

Padding ausrichtet Strukturelemente auf "natürliche" Adressgrenzen - sagen wir, int Mitglieder würden Versetzungen, die auf 32-Bit-Plattform mod(4) == 0 werden. Padding ist standardmäßig aktiviert. Es fügt die folgenden „Lücken“ in die erste Struktur:

struct mystruct_A {
    char a;
    char gap_0[3]; /* inserted by compiler: for alignment of b */
    int b;
    char c;
    char gap_1[3]; /* -"-: for alignment of the whole struct in an array */
} x;

Verpackung: , auf den anderen Seite verhindert Compiler von padding tun - dies hat explizit angefordert werden - unter GCC seines __attribute__((__packed__)), so folgt:

struct __attribute__((__packed__)) mystruct_A {
    char a;
    int b;
    char c;
};

erzeugen würde Struktur Größe 6 auf einer 32-Bit-Architektur.

Ein Hinweis obwohl -. Unaligned Speicherzugriff langsamer auf Architekturen, die es erlauben (wie x86 und amd64) und ist ausdrücklich verboten auf strenge Ausrichtung Architekturen wie SPARC

Andere Tipps

( Die oben genannten Antworten erklärt den Grund, ganz klar, aber es scheint über die Größe der Polsterung nicht ganz klar, so werde ich eine Antwort hinzufügen nach dem, was ich gelernt, von

Ich weiß, diese Frage ist alt und die meisten Antworten hier erklärt wirklich gut Klotzen, aber bei dem Versuch, es zu verstehen mich Ich stellte dar, mit einem „visuellen“ Bild dessen, was dazu beigetragen, geschieht.

Der Prozessor liest den Speicher in „Brocken“ von einer bestimmten Größe (Wort). Angenommen, der Prozessor Wort 8 Bytes lang ist. Es wird als eine große Reihe von 8 Byte Bausteine ??im Speicher suchen. Jedes Mal, es braucht einige Informationen aus dem Speicher zu erhalten, wird es einen dieser Blöcke zu erreichen und es bekommen.

Variablen Ausrichtung

Wie scheinen im Bild oben, spielt keine Rolle, wo ein Char (1 Byte lang) ist, da es in einem dieser Blöcke sein wird, erfordert die CPU nur 1 Wort zu verarbeiten.

Wenn wir mit Daten, die größer als ein Byte, wie ein 4-Byte-int oder einem 8-Byte-Doppel beschäftigen, wie sie im Speicher ausgerichtet sind, macht einen Unterschied, wie viele Worte haben werden von der CPU verarbeitet werden. Wenn 4-Byte-Chunks in einer Weise ausgerichtet sind, passen sie sich immer um das Innere eines Blocks (Adressenspeicher ein Vielfaches von 4 ist) nur ein Wort verarbeitet werden müssen. Andernfalls wird ein Stück von 4-Byte Teil von sich auf einen Block und teilweise auf dem anderen, erfordert der Prozessor 2 Wörter haben könnte zu verarbeiten, diese Daten zu lesen.

Das gleiche gilt für eine 8-Byte-Doppel, ausgenommen jetzt es in einer Speicheradresse Vielfaches von 8 sein muss es immer in einem Block zu garantieren.

Dies hält einen 8-Byte-Wort-Prozessor, aber das Konzept gilt auch für andere Größen von Worten.

Die Polsterung wirkt durch die Lücken zwischen diesen Daten füllen sicherzustellen, dass sie mit diesen Blöcken ausgerichtet sind, damit die Leistung zu verbessern und gleichzeitig die Speicher.

Wie jedoch auf anderen Antworten erwähnt, manchmal zählt der Raum mehr als die Leistung selbst. Vielleicht verarbeiten Sie viele Daten auf einem Computer, der nicht viel RAM hat (Swap-Speicher verwendet werden könnte, aber es ist viel langsamer). Sie könnten die Variablen im Programm anordnen, bis die am wenigsten Polsterung getan wird (da sie sich in einigen anderen Antworten exemplifiziert wurde), aber wenn das nicht reicht, können Sie explizit deaktivieren Polsterung, das ist das, was Verpackung: ist.

Struktur Verpackungsunterdrückt Struktur padding, Klotzen verwendet, wenn die Ausrichtung Sachen meisten verwendete Verpackung, wenn der Platz ankommt.

Einige Compiler bieten #pragma zu Unterdrückungs-Polsterung oder, um es zu n Anzahl von Bytes gepackt. Einige bieten Schlüsselwörter, dies zu tun. Im allgemeinen pragma die zum Modifizieren Struktur padding verwendet wird, im folgende Format sein (abhängig vom Compiler):

#pragma pack(n)

Zum Beispiel ARM stellt das __packed Schlüsselwort Unterdrückungs-Struktur Polsterung. Gehen Sie durch Ihre Compiler Handbuch um mehr darüber zu erfahren.

So eine gepackte Struktur ist eine Struktur ohne Polsterung.

Im Allgemeinen gepackten Strukturen verwendet werden

  • Platz sparend

  • eine Datenstruktur zur Übertragung über das Netzwerk zu formatieren, einige mit (Protokoll ist dies keine gute Praxis natürlich, weil Sie
    brauchen befassen sich mit Endian)

Padding und Verpackung sind nur zwei Aspekte derselben Sache:

  • Pack- oder Ausrichtung ist die Größe, auf die jedes Element abgerundet ist aus
  • Polsterung ist der zusätzliche Platz hinzugefügt, um die Ausrichtung entsprechen

In mystruct_A, eine Standardausrichtung von 4 annimmt, wird jedes Element an einem Vielfachen von 4 Byte ausgerichtet ist. Da die Größe char 1 ist, ist die Polsterung für a und c 4 - 1 = 3-Bytes während keine Polsterung für int b erforderlich ist, die bereits 4 Bytes. Es funktioniert auf die gleiche Art und Weise für mystruct_B.

Struktur Verpackung wird nur gemacht, wenn Sie Ihren Compiler sagen explizit die Struktur zu packen. Padding ist das, was Sie sehen. 32-Bit-System ist Klotzen jedes Feld Wortausrichtung. Wenn Sie Ihren Compiler gesagt hatte, die Strukturen zu packen, würden sie 6 und 5 Byte betragen. Sie nicht, dass obwohl tun. Es ist nicht tragbar und macht Compiler generieren viel langsamer (und manchmal sogar Buggy) Code.

Es sind keine buts über es! Wer das Thema erfassen wollen, müssen Sie die folgenden,

  

Speicherausrichtung ist die Art und Weise angeordnet sind und Daten in einem Computerspeicher abgerufen. Es besteht aus zwei separaten, aber miteinander verbundenen Problemen: Datenausrichtung und Datenstruktur padding . Wenn ein moderner Computer liest oder schreibt auf eine Speicheradresse, wird es diese großen Stücke in Wort tun (zum Beispiel 4-Byte-Stücke auf einem 32-Bit-System) oder größer. Datenausrichtungseinrichtung die Daten an einer Speicheradresse setzen gleich einem Vielfachen der Wortgröße, die die Leistung des Systems aufgrund der Art und Weise erhöht sich die CPU Griffe Speicher. Um die Daten auszurichten, kann es notwendig sein, einige bedeutungs Bytes zwischen dem Ende der letzten Datenstruktur und dem Anfang der nächsten einzufügen, die Datenstruktur padding ist.

  1. Um die Daten im Speicher, ein oder mehr leeren Bytes (Adressen) auszurichten eingefügt (oder leer) zwischen Speicheradressen, die für andere Strukturelemente, während der Speicherzuordnung zugeordnet sind. Dieses Konzept wird Struktur padding genannt.
  2. Architektur eines Computer-Prozessor ist so, dass es 1 Wort (4 Byte in 32-Bit-Prozessor) lesen kann, aus dem Speicher zu einem Zeitpunkt.
  3. Zur Nutzung dieses Vorteils des Prozessors zu machen, werden die Daten immer ausgerichtet als 4 Byte-Paket, das führt leere Adressen zwischen anderen Mitglieds-Adresse einzufügen.
  4. Aufgrund dieser Struktur padding Konzept in C, Größe der Struktur ist nicht immer gleiche wie das, was wir denken.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top