mein struct ist größer als er sein sollte.



  • Hallo Ich habe zwei structs:

    struct mac_addr
    {
      uint8_t a;
      uint8_t b;
      uint8_t c;
      uint8_t d;
      uint8_t e;
      uint8_t f;
    };
    
    struct arp_packet_t
    {
      uint16_t hw_type;
      uint16_t proto_type;
      uint8_t hw_size;
      uint8_t proto_size;
      uint16_t opcode;
      struct mac_addr src_mac;
      uint32_t src_ip;
      struct mac_addr dest_mac;
      uint32_t dest_ip;
    };
    

    Der erste struct hat eine Größe von sizeof(struct mac_addr) = 6 Bytes - so wie es sein soll.
    Aber der zweite struct hat eine Größte von sizeof(struct arp_packet_t) = 32 Bytes - es sollten aber nur 28 sein!
    Wo kommen sie zusätzlichen 4 Bytes her? Was habe ich übersehen?



  • Der Compiler richtet den uint32_t auf 32-Bit-Wortgrenzen aus, da Du aber mit der vorigen struct (wegen der 6 Bytes Länge) nicht auf einer 32-Bit-Wortgrenze endest, fügt er zwischen der struct und dem uint32_t 2 Paddingbytes ein. Das gleiche passiert weiter unten noch einmal. In der Summe also 28 + 2 x 2 = 32.

    Du mußt den Compiler anweisen, die Struktur ohne Alignment anzulegen, falls Du diese Einteilung unbedingt brauchst (z.B. weil Du Memorymapping oder I/O machen mußt).

    http://en.wikipedia.org/wiki/Data_structure_alignment



  • Was meinst du mit, "wie es seien sollte"? Der Compiler darf Strukturen mit beliebigen Padding-Bytes auffüllen. Das hat den Sinn, dass der Zugriff auf die einzelnen Elemente schneller wird.

    Wie man das deaktiviert hängt vom Compiler ab.

    Schau dir mal beim GCC __attribute__ an. __attribute__((packed)) dürfte dich interessieren.


Anmelden zum Antworten