bool8?



  • Hi,

    ich habe neulich im Netz diesen Code gefunden und kann damit irgendwie nichts anfangen?

    typedef struct
    {
        unsigned char value1 : 1;
        unsigned char value2 : 1;
        unsigned char value3 : 1;
        unsigned char value4 : 1;
        unsigned char value5 : 1;
        unsigned char value6 : 1;
        unsigned char value7 : 1;
        unsigned char value8 : 1;
    } bool8;
    

    Was ist das?!?!?!!



  • Hi,

    das ist ein Bitfield.

    Jedes Bit dieses eigentlich "unzerlegbaren" Datentyps kann nun wie ein Member einer Struktur angesprochen werden.



  • Aber wofür soll das gut sein und wozu braucht man sowas?

    Der kerl hatte die klasse hierfür benutzt:

    typedef struct
    {
        int x, y;
    
        bool8 data; /* used texture, material, collidable, ...
    } tile;
    

    Kapier den sinn dahinter nicht so 😞



  • Er wollte möglichst viele Statusinformationen, die mit Ja/Nein beantwortet werden können, in möglichst wenig Speicher packen und doch einfachen Zugriff behalten.

    bool8 data;
    
    ...
    data.value1 = 1; 
    data.value2 = 0;
    ...
    
    //hmm, welchen Wert hatte nochmal value1?
    if (data.value1) ...
    

    Stells dir einfach als 8'er Reihe nebeneinanderliegender LED's vor, die entweder an oder aus sind.



  • Also das bedeutet im Klartext:
    Er hat 7 Byte eingespart dadurch? Wow das würd sich bei 2D Arrays für Levels sehr positiv auf die Speichergröße auswirken bei größeren levels.... hmn... interessant! 😮



  • Jo, ist aber etwas langsamer im Zugriff.

    Und es ist auch evtl. Compilerspezifisch, wie groß der verwendete Datentyp ist.
    (Kann z.B. auch gut sein, dass dafür ein 4Byte Int genommen wird.) Dann hat er nur 4 Bytes gespart.



  • SeppSchrot schrieb:

    Jo, ist aber etwas langsamer im Zugriff.

    Sicher? Naja aber bei einem 2D array der größe von 2048x2048 steigt die quantität (größe) über die qualität (speed) 🙂



  • Irgendwann kommen dann auch noch Fragen wie Cache-Effizienz ins Spiel.



  • Jester schrieb:

    Irgendwann kommen dann auch noch Fragen wie Cache-Effizienz ins Spiel.

    d.h.?



  • Naja, angenommen Du läuft über das ganze Feld. Wenn Du pro Eintrag 1 Byte hast, dann hat Dein Feld eben 2048x2048 1-Byte einträge, und alle 16 Byte oder so mußt Du einmal über den Bus zum Speicher und das ist lahm. Also alle 16 Felder Zugriff. Im Falle von 1 Bit pro Feld mußte halt nur alle 8*16 = 128 Felder über den Bus.

    Die Frage ist: was braucht länger: Das Bit-schubsen oder der Hauptspeicher-zugriff.

    In Wirklichkeit isses natürlich noch ein bissel komplexer: Du hast First-Level-Cache, Second-Level und dann Hauptspeicher.

    Interessant ist es vor allem dann, wenn Du mit 1 Bit pro Feld alles z.B. in den L2-Cache kriegst, aber ohne eben nicht mehr. Dann haste halt viel mehr Speicherzugriff in letzterem Fall.

    MfG Jester


Anmelden zum Antworten