Was bedeutet „__attribute__((gepackt, ausgerichtet(4)))“

Lesezeit: 5 Minuten

Benutzeravatar von Aaron Lee
Aaron Lee

Es ist C-Sprache. Es steht geschrieben, dass:

typedef struct __attribute__((packed, aligned(4))) Ball {
    float2 delta;
    float2 position;
    //float3 color;
    float size;
    //int arcID;
    //float arcStr;
} Ball_t;
Ball_t *balls;

Bitte sagen Sie mir, was es bedeutet und wie Sie dieses Schlüsselwort verwenden.

  • Es ist ein “Typattribut” .. (Ich habe das mit “C-Attribut gepackt” in Google gefunden. Sicher können andere mindestens so gut!)

    Benutzer166390

    2. August 2012 um 3:01 Uhr


  • Siehe diese Frage – allerdings mit aligned(4) da brauchst du dir wahrscheinlich keine Sorgen zu machen.

    – Keith Thompson

    2. August 2012 um 4:07 Uhr

Benutzeravatar von Jeyaram
Jeyaram

Bevor ich antworte, möchte ich Ihnen einige Daten aus dem Wiki geben


Ausrichtung der Datenstruktur ist die Art und Weise, wie Daten im Computerspeicher angeordnet und abgerufen werden. Es besteht aus zwei getrennten, aber zusammenhängenden Themen: Datenabgleich und Auffüllen von Datenstrukturen.

Wenn ein moderner Computer von einer Speicheradresse liest oder in eine Speicheradresse schreibt, tut er dies in wortgroßen Blöcken (z. B. 4-Byte-Blöcke auf einem 32-Bit-System). Datenabgleich bedeutet, dass die Daten an einem Speicher-Offset platziert werden, der einem Vielfachen der Wortgröße entspricht, was die Systemleistung aufgrund der Art und Weise erhöht, wie die CPU den Speicher verarbeitet.

Um die Daten auszurichten, kann es notwendig sein, einige bedeutungslose Bytes zwischen dem Ende der letzten Datenstruktur und dem Beginn der nächsten einzufügen, das heißt Auffüllen von Datenstrukturen.


gcc bietet Funktionen zum Deaktivieren der Strukturauffüllung. dh um diese bedeutungslosen Bytes in einigen Fällen zu vermeiden. Betrachten Sie die folgende Struktur:

typedef struct
{
     char Data1;
     int Data2;
     unsigned short Data3;
     char Data4;

}sSampleStruct;

sizeof(sSampleStruct) wird 12 statt 8 sein. Wegen der Strukturpolsterung. Standardmäßig werden in X86 Strukturen auf 4-Byte-Ausrichtung aufgefüllt:

typedef struct
{
     char Data1;
     //3-Bytes Added here.
     int Data2;
     unsigned short Data3;
     char Data4;
     //1-byte Added here.

}sSampleStruct;

Wir können benutzen __attribute__((packed, aligned(X))) darauf zu bestehen, dass eine bestimmte (X) große Polsterung vorhanden ist. X sollte Zweierpotenzen sein. Siehe hier

typedef struct
{
     char Data1;
     int Data2;
     unsigned short Data3;
     char Data4;

}__attribute__((packed, aligned(1))) sSampleStruct;  

Das oben angegebene gcc-Attribut erlaubt also kein Auffüllen der Struktur. Die Größe beträgt also 8 Bytes.

Wenn Sie dasselbe für alle Strukturen tun möchten, können wir einfach den Ausrichtungswert zum Stapeln verwenden #pragma

#pragma pack(push, 1)

//Structure 1
......

//Structure 2
......

#pragma pack(pop)

  • Wenn der Speicher Daten in 4-Byte-Blöcken speichert, warum fügt er dann nicht 2 Füllbytes zum unsigned short hinzu (es ist 2 Byte lang)? oder der Compiler fügt einfach Füllbytes zum ersten und letzten Mitglied der Struktur hinzu? können Sie es bitte klären.

    – Benutzer

    6. März 2014 um 11:33 Uhr

  • @User Plz verweist auch darauf. Wenn Sie immer noch nicht klar sind, kommen Sie bitte um Hilfe. stackoverflow.com/questions/11772553/…

    – Jeyaram

    6. März 2014 um 11:47 Uhr

  • Wer sagt, dass diese Füllbytes bedeutungslos sind, weiß nicht, dass falsch ausgerichteter Datenzugriff eine Kuriosität der x86-Architektur ist. Diese Bytes sind notwendig, um Ausnahmen zu vermeiden, wenn der Prozessor versucht, Daten – beispielsweise eine ganze Zahl – zu laden, die seine natürliche Ausrichtungsgrenze überspannen.

    – Tanveer Badar

    20. November 2019 um 6:27 Uhr


  • @TanveerBadar sie meinten das die Werte der Füllbytes sind bedeutungslos, nicht ihre Anwesenheit.

    – Len

    22. September 2020 um 23:36 Uhr

  • @MorElmaliach Padding geschieht bezüglich der Zugänglichkeit von Mitgliedern der Struktur. Lesen Sie die akzeptierte Antwort des threads stackoverflow.com/questions/11772553/… für mehr Klarheit.

    – Jeyaram

    29. November 2021 um 10:44 Uhr

Benutzeravatar von cnicutar
Cnicutar

  • packed bedeutet, dass es den kleinstmöglichen Platz für verwenden wird struct Ball – dh es werden Felder ohne Polsterung zusammengepfercht
  • aligned bedeutet jeder struct Ball beginnt an einer 4-Byte-Grenze – dh für alle struct Ballseine Adresse kann durch 4 geteilt werden

Dies sind GCC-Erweiterungen, die nicht Teil eines C-Standards sind.

  • Können Sie bitte sagen, ob wir beide am Ende nur Bytes hinzufügen?

    – schanti schul

    23. November 2021 um 13:57 Uhr

  • Was meinst du mit “4-Byte-Grenze”? Was bedeutet das?

    – Benutzer2762996

    28. Dezember 2021 um 15:15 Uhr

  • @schantischul Nein, dem Compiler steht es frei, diese Bytes hinzuzufügen (sie werden als Polsterung) wo es will. Sie werden am häufigsten neben gestellt char Arrays oder andere Datentypen, die < 32 Bit (oder 64 Bit) lang sind - abhängig vom Zielprozessor.

    – sherrelbc

    17. Januar um 15:42 Uhr

  • @ user2762996 Eine “Grenze” ist ein Adressierungskonzept. Ist es oft am effizientesten (in Zeit und Programmraum) zu ausrichten Mitglieder einer Struktur auf die “Wortgröße” des Zielprozessors. Bei modernen Computern sind dies häufig 32 oder 64 Bit. Tatsächlich unterstützten einige alte Prozessoren dies nicht nicht ausgerichtet Zugriffe auf den Speicher und würden Ausführungsbedingungen auslösen (obwohl das Verhalten im Ausnahmehandler emuliert werden könnte). Mathematisch wird gesagt, dass eine Adresse, die an einer beliebigen Grenze ausgerichtet ist, “modulo 0” dieser Größe ist.

    – sherrelbc

    17. Januar um 15:46 Uhr

  • Das ist, aligned4 = !!(addr % 4); wird 1 für jede Adresse, die auf 0, 1, 2 oder 3 endet. Ähnlich aligned8 = !!(addr & 8); ist 1 für jede Adresse, die mit 0 bis 7 endet. Diese beiden Ausdrücke repräsentieren 4 (32 Bit) oder 8 (64 Bit) Byte-Ausrichtungen. Versuch es.

    – sherrelbc

    17. Januar um 15:54 Uhr


Benutzeravatar von Julian Stecklina
Julian Steckline

Das Attribut packed bedeutet, dass der Compiler keine Auffüllung zwischen den Feldern von hinzufügt struct. Padding wird normalerweise verwendet, um Felder auf ihre natürliche Größe auszurichten, da einige Architekturen Strafen für nicht ausgerichteten Zugriff auferlegen oder dies überhaupt nicht zulassen.

aligned(4) bedeutet, dass die Struktur auf eine durch 4 teilbare Adresse ausgerichtet werden sollte.

  • Können Sie bitte sagen, ob wir beide am Ende nur Bytes hinzufügen?

    – schanti schul

    23. November 2021 um 13:57 Uhr

1424790cookie-checkWas bedeutet „__attribute__((gepackt, ausgerichtet(4)))“

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy