Größe einer Struktur ermitteln



  • Guten Tag!

    Wieder eine recht simple Aufgabe, die mir aber schon wieder Probleme bereitet. Ich möchte die Größe einer Struktur rechnerisch ermitteln - ansich nicht schwer, jedoch ist mir der genaue Rechengang entfallen.

    Nehmen wir mal eine ganz normale Struktur als Beispiel:

    typedef struct
    {
       int x;
       char name[31];
       double y;
       double z;
       char stadt[40];
       short a;
       int b;
    }Struktur;
    

    Nun soll man die Größe der angelegten Struktur ermitteln.

    Mein Ergebnis wäre: 88
    Rechengang:

    integer 4 Byte
    short und double 2 Byte
    char 1 Byte

    typedef struct
    {
       int x; //4 
       char name[31]; //35
       double y; //37 - muss aber auf einem wert liegen, der durch 2 teilbar ist: 38
       double z; //40
       char stadt[40]; //80
       short a; //82
       int b; //86 - Wert muss durch 4 teilbar sein: 88
    }Struktur;
    

    Habe ich das so richtig verstanden?



  • Wenn du die richtige Größe mit sizeof ermittelst wirst du merken dass dein struct in Wirklichkeit wohl eher 104 Bytes groß ist. Grund: Padding

    btw: Die Größe eines double ist in der Regel 8 Byte.



  • Erstens: double ist 4 Byte groß
    Zweitens: Padding ist eine Entscheidung des Compilers
    Drittens: die sicherste Methode zur Berechnung ist sizeof



  • CStoll schrieb:

    Erstens: double ist 4 Byte groß

    8 😉



  • Schau dir mal die Größen auf deinem System an.
    Die Größen der Variablentypen sind nämlich extrem Systemabhängig.

    Aber double ist größer als 2 Byte, da ein float i.A. schon 4 Byte hat.

    Du kannst das aber vom Compiler ermitteln lassen (sizeof() sei dank:

    printf("Größe von int      : %2d\n", sizeof(int));
    printf("Größe von double   : %2d\n", sizeof(double));
    //Es  geht natürlich auch
    printf("Größe von Struktur : %2d\n", sizeof(Struktur)); // :D
    


  • Sicher ist es mit sizeof am einfachsten, jedoch würde mich nur interessieren, ob mein Rechengang korrekt wäre.
    Mal abgeshen davon, wie groß ein double etc ist 🙂



  • MichaelE schrieb:

    Sicher ist es mit sizeof am einfachsten, jedoch würde mich nur interessieren, ob mein Rechengang korrekt wäre.
    Mal abgeshen davon, wie groß ein double etc ist 🙂

    Der Compiler entscheidet über das Padding!



  • dot schrieb:

    CStoll schrieb:

    Erstens: double ist 4 Byte groß

    8 😉

    Wenn du es sagst, will ich dir da mal glauben 🕶

    @Michael: Ob und wie viele Padding-Bytes (das ist die offizielle Bezeichnung für dein "Wert muss durch 4 teilbar sein") in die Struktur eingefügt werden, hängt von deinem Compiler ab und kann teilweise auch durch den Programmierer beeinflusst werden. Ansonsten dürfte die Rechnung hinkommen.
    Beim ersten Überfliegen der Struktur komme ich auf Werte zwischen 97 (komplett ohne Padding) und 112 (alle Member auf 8-Byte-Grenzen ausgerichtet).



  • Vielen Dank für die Antworten.
    Bin letztendlich auf den Wert gekommen!



  • Dann nimm noch offsetof() und finde selber raus wie es auf deinem System ist.



  • MichaelE schrieb:

    Sicher ist es mit sizeof am einfachsten, jedoch würde mich nur interessieren, ob mein Rechengang korrekt wäre.

    Im allgemeinen nicht. Genaueres findest du in der Dokumentation deines Compilers.


Anmelden zum Antworten