Mehrere sehr kleine Integer in einem bool[] speichern



  • Wenn es darum geht, immer zwei Timestamps in 5 Byte unterzubringen, wuerde ich das etwa so machen:

    #include <cstdint>
    #include <iostream>
    
    class timestamps {
    public:
      timestamps(std::uint32_t first,
                 std::uint32_t second)
        : lower((first & 0x1ffff) | ((second & 0x7fff) << 17)),
          upper((second >> 15) & 0x03) { }
    
      std::uint32_t first () const { return lower & 0x1ffff; }
      std::uint32_t second() const { return (lower >> 17) | (upper << 15); }
    
    private:
      std::uint32_t lower;
      std::uint8_t  upper;
    } __attribute__((packed)); // WICHTIG: gcc-spezifisch. 
    
    int main() {
      timestamps test(81234, 85432);
    
      std::cout << test.first() << ", " << test.second() << '\n';
      std::cout << sizeof(test) << '\n';
    }
    

    Wenn du einen anderen Compiler als gcc unterstuetzen musst, schlag in dessen Doku nach, wie er packed structs handhabt. MSVC hat ein #pragma pack, wenn ich das richtig im Kopf habe.

    Was das Gerede um Bitadressen angeht:

    ISO/IEC 14882:2011 3.9.2 (3) schrieb:

    A valid value of an object pointer type represents either the address of a byte in memory (1.7) or a null pointer (4.10).

    Da ein Byte kein Bit sein kann (in ein Bit passt das basic execution character set nicht rein), kann man also keine Adressen von Bits haben.



  • arkot333 schrieb:

    dot schrieb:

    Der Standard sagt, dass Bytes eine Adresse haben. Ja, damit ist er theoretisch auch kompatibel mit eine hypothetischen Architektur, wo jedes Bit eine Adresse hat. Im Rahmen von Standard C++ sind Bits dennoch nicht adressierbar, selbst auf einer solchen Architektur, wenn sie existieren würde...

    Wie man die Bitadressen bekommt ist selbstverständlich implementation-defined! Aber danach kann man sie wie jeden anderen Zeiger benutzen!!!

    Nope, complete objects sind in C++ mindestens 1 Byte groß und damit kannst du in C++ niemals die Adresse eines Bit bestimmen, selbst wenn du eine Architektur erfindest, wo das möglich wäre...



  • cooky451 schrieb:

    Hm... das geht wie? Ich kann mich so direkt jetzt an keine load oder store Instruction erinnern mit der man einzelne bits ansprechen kann.

    Du darfst dir gerne das Programmierhandbuch durchlesen. Prinzipiell ist es ein Feature des memory controlers fuer bestimmte Bereiche des Speichers:

    Bit-banding maps a complete word of memory onto a single bit in the bit-band region. For example, writing to one of the alias words will set or clear the corresponding bit in the bitband region.

    D.h. du "schreibst" ein ganzes Byte und setzt ein Bit. Du arbeitest wie mit gewoehnlichen Bytes, es sind keine neuen Prozessorinstruktionen noetig. Sie werden nur vom Memory controller anders interpretiert.


Anmelden zum Antworten