struktur und pragma



  • ich habe eine strukture, die so definiert ist

    struct meine_struktur
     {
      unsigned short  referenz;   // 2 Bytes
      WERT  wert;                 // 8 Bytes
     };
    
     /** definition von WERT**/
    
    typedef union
     {
      hyper l_wert;                    // LONG LONG INT 8 BYTE
      double d_wert;                   // DOUBLE 8 BYTE
     }
    WERT;
    

    ich verwende diese Strukture "meine_struktur" in einem risiegen Programm und bekomme mit
    sizeof(struct meine_struktur) 16 bytes zurück !!! wieso ?
    aber die logische speichergrösse ist 10 Bytes (8+2).
    in mein Programm wurde diese pragma pack verwendet und die ist für diesen effekt verantwortlich.

    wie verwende ich #pragma damit nur meine Struktur 10 Bytes gross wird so dass kein einfluss auf den rest meines Programmes ergibt.

    so ?

    #pragma pack(push, 1)
    
    struct meine_struktur
     {
      unsigned short  referenz_;
      WERT  wert;
     };
    #pragma pack(pop)
    

    ich habe in die hilfe von visual studio nachgelesen aber ich kapiere bis jetzt nicht was die n bei pack(n) genau bewirkt

    danke im voraus
    youssef



  • z.B. so:

    #ifdef _WIN32 // WINNT_40 || Windows2000
    #pragma pack (1)
    ... 
    #pragma pack ()
    #else
    ...
    #endif
    

    oder einfach nur so:

    #pragma pack (1)
    

    Blackbird



  • Wieso tust du das?



  • youssef schrieb:

    ich verwende diese Strukture "meine_struktur" in einem risiegen Programm und bekomme mit
    sizeof(struct meine_struktur) 16 bytes zurück !!! wieso ?

    Strukturen besitzen ein Alignment, dh sie werden im Speicher an gewissen Adressen ausgerichtet. In deinem Fall wird das Alignment vermutlich 8 sein. Deshalb fügt der Compiler nach referenz_ 6 Füllbytes ein, damit wert wiederum aligned ist. Deshalb spuckt sizeof 16 aus.

    youssef schrieb:

    wie verwende ich #pragma damit nur meine Struktur 10 Bytes gross wird so dass kein einfluss auf den rest meines Programmes ergibt.

    Erstmal sollte man wissen, dass #pragma compiler-spezifisch ist. Dh, nicht jeder Compiler muss bzw. wird sowas unterstützen. Deshalb ist es manchmal evtl. besser, dass man unabhängig vom Alignment designed.
    Falls du dennoch mit #pragma das Alignment einstellen willst, dann solltest du Folgendes probieren:

    #pragma pack(1) // Alignment auf 1 setzen - praktisch kein Alignment
    typedef union
    {
      hyper l_wert;                    // LONG LONG INT 8 BYTE
      double d_wert;                   // DOUBLE 8 BYTE
    }
    WERT;
    #pragma pack() // default Alignment
    
    struct meine_struktur
    {
      unsigned short  referenz;   // 2 Bytes
      WERT  wert;                 // 8 Bytes
    };
    


  • zuerst danke an euch alle und besonders an groovemaster.
    @groovemaster:
    das hast super erklärt. ich habe einen interessanten atikel im internet unter http://www.pronix.de/pronix-775.html gefunden und das thema "Alignment" ist mir jetzt klarer geworden.

    du hast auch völlig recht mit der Alignment 8 . unter projete->einstellungen ist "Struct-Element-Ausrichtung" auf 8 bytes gesetzt und das erklärt die 16 bytes mit sizeof.

    ich glaube dass es nicht nötig ist, die alignment für die union zu setzen.

    ich möchte sicher sein dass das alignment-setzen nur für die struktur "meine_struktur" gilt und keinenfalls den alignment anderen strukturen oder unionen im programm ändert.
    so funktioniert bei mir:

    #pragma pack(push, 1)
    
    struct meine_struktur
     {
      unsigned short  referenz_;
      WERT  wert;
     };
    #pragma pack(pop)
    

    aber so nicht(program absturz)

    #pragma pack(1)
    
    struct meine_struktur
     {
      unsigned short  referenz_;
      WERT  wert;
     };
    

    youssef


Anmelden zum Antworten