[Split: uint8_t oder..]Adressierbarkeit und Bytes


  • Mod

    Es gibt eben zwei unterschiedliche Bytes. Einerseits "Byte" in seiner technisch korrekten Ursprungsdefinition, als kleinste adressierbare Einheit. Andererseits "Byte" als Synonym für eine 8-Bit-Einheit; im Alltagssprachgebrauch etabliert, weil 8 Bit seit Jahrzehnten auf allen weit verbreiteten Geräten die kleinste adressierbare Einheit ist.



  • quarkmalwiederleider schrieb:

    hustbaer schrieb:

    Swordfish schrieb:

    Ein (unsigned) short und ein (unsigned) int ist mindestens 2 Byte lang.
    Ein (unsigned) long ist mindestens 4 Bytes lang.
    Ein (unsigned) long long ist mindestens 8 Bytes lang.

    Alles falsch.
    Wie kommst du auf die Idee?

    Wie kommst du auf die Idee, dass das von Swordfisch falsch sein könnte?

    Weil es eben falsch ist.
    Der C++ Standard definiert ein Byte als kleinste (über C++) adressierbare Einheit. Ein C++ Byte muss mindestens 8 Bit haben. Es kann aber z.B. auch 24 Bit haben. Auf solchen Systemen kann dann ohne weiteres gelten sizeof(char)==sizeof(short)==sizeof(int)==1 .


  • Mod

    hustbaer schrieb:

    Der C++ Standard definiert ein Byte als kleinste (über C++) adressierbare Einheit.

    Das ist jetzt aber auch falsch. Der Standard definiert ein Byte als Einheit, die mindestens den Zeichensatz abspeichern kann und verlangt, dass diese Bytes eindeutig adressierbar sind. Ob die Maschine vielleicht noch kleinere Dinge adressieren kann, ist nicht ausgeschlossen.



  • Ich hab auch extra "kleinste (über C++) adressierbare Einheit" geschrieben.

    Und etwas kleineres als ein C++ Byte kannst du über ein C++ Programm einfach nicht adressieren.
    Falls du meinst das stimme nicht, würde ich gerne wissen wie das gehen soll.


  • Mod

    bool x;
    &x;
    


  • Ein bool ist EDIT: mindestens /EDIT ein Byte gross.
    Und jetzt?


  • Mod

    hustbaer schrieb:

    Ein bool ist ein Byte gross.

    Wo steht das im Standard?



  • Oder mindestens ein Byte gross? Kann sein.
    Worum es geht: ein bool kann nicht kleiner als ein Byte sein.

    ps:

    n3337, 1.8-5 schrieb:

    Unless it is a bit-field (9.6), a most derived object shall have a non-zero size and shall occupy one or more bytes of storage. Base class subobjects may have zero size. An object of trivially copyable or standard-layout type (3.9) shall occupy contiguous bytes of storage.

    ps2:
    OK, ja, sizeof(bool) ist implementation-defined (siehe z.B. 5.3.3-1). Aber auf jeden Fall eben mindestens 1.


  • Mod

    Dann eben meine tolle neue Compilererweiterung __BIT_ADDRESS. Liefert die bit-genaue Adresse eines Bit-Fields. Bloß weil etwas im Standard nicht vorgeschrieben ist, ist es dadurch nicht verboten. Der Standard ist bloß so formuliert, dass er mit Byteadressierung klar kommt, er schreibt sie nicht vor.



  • SeppJ schrieb:

    Dann eben meine tolle neue Compilererweiterung __BIT_ADDRESS. Liefert die bit-genaue Adresse eines Bit-Fields. Bloß weil etwas im Standard nicht vorgeschrieben ist, ist es dadurch nicht verboten.

    ARGH.
    Dann eben die "kleinste (über standard C++) adressierbare Einheit".

    SeppJ schrieb:

    Der Standard ist bloß so formuliert, dass er mit Byteadressierung klar kommt, er schreibt sie nicht vor.

    Was die Maschine macht ist wurscht, das sollte klar sein.
    Ändert aber nichts daran was man mit standard C++ machen kann und was nicht.


  • Mod

    Wenn wir es so genau nehmen, wird nirgendwo verlangt, dass das Ergebnis eines Adressoperators 8-Bit aligned ist.



  • Worauf willst du hinaus? Verstehe ich gerade nicht.


  • Mod

    hustbaer schrieb:

    Worauf willst du hinaus? Verstehe ich gerade nicht.

    Dass der Bitrechner durchaus seine Natur in standardkonformen C++ auch ohne Erweiterungen zeigen kann, selbst wenn der C++-Standard den Adressoperator für alle Objekte < 8 Bit verboten hat.

    Und wie fast immer bei solchen Klugscheißerthemen kommt man am Ende beim schwarzen Schaf des Standards an: vector<bool>. Seine Iteratoren dürfen zwar irgendwelche Proxyobjekte sein, aber es wäre auch ein dünner Wrapper um einen bitgenauen Zeiger vorstellbar. Zwar würde man damit nicht direkt ein Bit adressieren im Sinne des Adressoperators, aber man hätte schon irgendwie ein Bit adressiert, in dem Sinne, dass ein Iterator eine Art von Adressierung darstellt.



  • SeppJ schrieb:

    Klugscheißerthemen

    Das Klugscheißerthema hast du doch daraus gemacht, indem du behauptet hast dass ich Unrecht habe.

    Ich hab lediglich behauptet dass du in C++ nichts adressieren kannst was kleiner als ein C++ Byte ist.
    Das ist so, ganz einfach, weil der Standard dir keine Möglichkeit gibt etwas anderes zu tun.

    Hol dir die Adresse von irgend etwas, und du bekommst die Adresse des ersten Bytes dieses Irgendwas. Und das Irgendwas muss eine integrale Anzahl Bytes gross sein. Und was auch immer du mit Zeigerarithmetik machst, so lange du die Regeln nicht verletzt wird dabei auch nie etwas rauskommen was nicht auf ein Byte zeigt.

    Von Proxies etc. war auch nie die Rede. Denn über Hilfskonstrukte einzelne Bits aus etwas rauszumaskieren kann man wohl kaum als "adressieren" bezeichnen.

    In Hinsicht auf das C++ Memory Model und dessen Relevanz für z.B. Multithreading würde ich das auch nichtmal als Hirnwichserei bezeichnen.

    SeppJ schrieb:

    in dem Sinne, dass ein Iterator eine Art von Adressierung darstellt.

    Jetzt verdrehst du bloss noch Begriffe damit du doch noch Recht haben kannst.

    BTW: Das besondere an den vector<bool> Iteratoren ist nicht dass sie Proxy-Objekte sein dürfen, sondern dass das Dereferenzieren so eines Iterators einen Proxy zurückgeben darf.
    D.h. wenn du die Verwendung von Iteratoren als adressieren bezeichnen willst, dann adressiert ein vector<bool> Iterator einen Proxy. Und auch dieser kann nicht kleiner als ein Byte sein.


  • Mod

    hustbaer schrieb:

    SeppJ schrieb:

    Klugscheißerthemen

    Das Klugscheißerthema hast du doch daraus gemacht, indem du behauptet hast dass ich Unrecht habe.

    Ich hab lediglich behauptet dass du in C++ nichts adressieren kannst was kleiner als ein C++ Byte ist.

    Nein, hast du nicht. Verdreh nicht die Tatsachen, besonders nicht, wenn du mir im gleichen Beitrag Begriffsverdrehung vorwirfst.

    Der C++ Standard definiert ein Byte als kleinste (über C++) adressierbare Einheit.

    Das ist nicht die Definition des Standards für Bytes! Bytes haben in C++ nichts mit Adressierung zu tun. Adressierung kommt erst ins Spiel durch den Adressoperator, den der Standard nicht erlaubt für Objekte, die kleiner als ein (C++)-Byte wären*. Das ändert nicht die Definition des Byte, sondern die Funktion des Adressoperators.

    *: Außer Objekte der Größe 0, wo er wieder erlaubt ist.



  • SeppJ schrieb:

    hustbaer schrieb:

    SeppJ schrieb:

    Klugscheißerthemen

    Das Klugscheißerthema hast du doch daraus gemacht, indem du behauptet hast dass ich Unrecht habe.

    Ich hab lediglich behauptet dass du in C++ nichts adressieren kannst was kleiner als ein C++ Byte ist.

    Nein, hast du nicht. Verdreh nicht die Tatsachen

    Du hast Recht.

    Ich habe behauptet dass der Standard das Byte als kleinste adressierbare Einheit definiert.

    Was streng genommen nicht stimmt. Der Standard definiert das Byte nicht über diese Beschreibung. Er macht aber mMn. eindeutig klar dass es eben so ist, also dass man nichts adressieren kann was kleiner als ein Byte ist.

    Wenn du gleich zu Anfang genau das bekrittelt hättest, hätte ich dir vermutlich gleich Recht gegeben.

    Hast du aber nicht, du hast versucht den Standpunkt zu vertreten dass man in C++ sehr wohl etwas adressieren kann was kleiner als ein Byte ist. Und das stimmt halt nunmal einfach nicht.

    SeppJ schrieb:

    , besonders nicht, wenn du mir im gleichen Beitrag Begriffsverdrehung vorwirfst.

    Willst du damit behaupten dass der Vorwurf nicht gerechtfertigt wäre?


  • Mod

    hustbaer schrieb:

    SeppJ schrieb:

    hustbaer schrieb:

    SeppJ schrieb:

    Klugscheißerthemen

    Das Klugscheißerthema hast du doch daraus gemacht, indem du behauptet hast dass ich Unrecht habe.

    Ich hab lediglich behauptet dass du in C++ nichts adressieren kannst was kleiner als ein C++ Byte ist.

    Nein, hast du nicht. Verdreh nicht die Tatsachen

    Du hast Recht.

    Ich habe behauptet dass der Standard das Byte als kleinste adressierbare Einheit definiert.

    Was streng genommen nicht stimmt. Der Standard definiert das Byte nicht über diese Beschreibung. Er macht aber mMn. eindeutig klar dass es eben so ist, also dass man nichts adressieren kann was kleiner als ein Byte ist.

    Das ist also eindeutig klar, wohingegen doch der Grund, warum du Swordfish nieder gemacht hast war, dass es für den Threadersteller eventuell nicht klar sein könnte, was Swordfish mit Byte gemeint hat?

    Hast du aber nicht, du hast versucht den Standpunkt zu vertreten dass man in C++ sehr wohl etwas adressieren kann was kleiner als ein Byte ist. Und das stimmt halt nunmal einfach nicht.

    In C++ sind Objekte adressierbar, die kleiner als 1 Byte sind. Standardkonformes C++ braucht dies nicht zu unterstützen, aber es ist auch nicht verboten. Prinzipielle Adressierbarkeit von Dingen ist überhaupt kein Thema im Standard, sondern nur das Gegenteil, welche Dinge wie adressierbar sein müssen und welche nicht.

    SeppJ schrieb:

    , besonders nicht, wenn du mir im gleichen Beitrag Begriffsverdrehung vorwirfst.

    Willst du damit behaupten dass der Vorwurf nicht gerechtfertigt wäre?

    Nein.



  • SeppJ schrieb:

    In C++ sind Objekte adressierbar, die kleiner als 1 Byte sind. Standardkonformes C++ braucht dies nicht zu unterstützen (...)

    *schnarch*

    OK, lassen wir die Diskussion, die führt zu nix mehr.


Log in to reply