Sind Daten in struct immer hintereinander?



  • Ich habe von einer externen Library eine Funktion, die eben darauf vertraut, dass es so ist. Und da mein momentanes Projekt eh rein auf allen möglichen Sachen von Microsoft basiert und nur für mich privat rein zum Testen ist, spielt Portabilität im Moment keine Rolle 🙂



  • Jo echt was die Leute immer mit portabel haben.

    #pragma pack(1)
    struct
    ...
    #pragma pack()



  • So ein struct sollte in msvc schon defaultmäßig frei von padding sein. Warum eigentlich nicht einfach ein int array nehmen? Das wär überall und unter allen Umständen garantiert richtig...



  • dot schrieb:

    So ein struct sollte in msvc schon defaultmäßig frei von padding sein.

    Eine struct aus drei ints hat bei MSVC per Default kein Padding.

    Eine struct hat allerdings bei MSVC nicht automatisch "pack(1)", d.h. hier gäbe es mit den Default-Compiler-Einstellungen (="pack(8)" IIRC) sehrwohl Padding zwischen "ch" und "i":

    struct foo
    {
        char ch;
        int i;
    };
    


  • Darum sagte ich ja auch so ein struct ist defaultmäßig frei von padding 😉



  • Danke für eure Hilfe, ich werds mal ausprobieren.

    Warum eigentlich nicht einfach ein int array nehmen?

    Weil mein struct leider auch aus anderen (nur intergrierten) Datentypen wie short oder char besteht.


  • Mod

    Bobbyxyz schrieb:

    Weil mein struct leider auch aus anderen (nur intergrierten) Datentypen wie short oder char besteht.

    Und jetzt kommt natürlich die Frage, warum es überhaupt nötig ist, dass die exakt nacheinander liegen.



  • Jop, denn dann muss man natürlich auf das struct-packing achten. Anstatt es einfach auf 1 zu stellen würd ich mir mal überlegen warum ich das wirklich haben will. Willst du ein struct 1:1 in Binärdateien dumpen? Natürlich funktioniert das unter gewissen Gegebenheiten aber wenn mans ordentlich macht (richtig Serialisieren/Deserialisieren) kommt man ohne solche Hacks aus. Das Padding ist ja nicht umsonst da. Auch auf einem Core i7 ist ein Zugriff auf nicht ausgerichteten Speicher ca. 3x langsamer als ein Zugriff auf richtig ausgerichteten Speicher und das struct Padding baut der Compiler eben genau ein damit alle Member richtig ausgerichtet sind...



  • Vorrausgesetyt, alle Datentypen im struct sind 32-bit groß und ich kompiliere das Programm für 32-bit, dann sollte es keine Probleme geben oder?
    Und was ist dann, wenn ich es für 64-bit kompiliere?



  • Bobbyxyz schrieb:

    Vorrausgesetyt, alle Datentypen im struct sind 32-bit groß und ich kompiliere das Programm für 32-bit, dann sollte es keine Probleme geben oder?
    Und was ist dann, wenn ich es für 64-bit kompiliere?

    Dann hat ein Zeiger halt plötzlich 8 Byte gross und der Compiler baut ev. padding ein. Aber ob und wie viel da reinkommt hängt sehr davon ab mit was du für was kompilierst.


Anmelden zum Antworten