bool = platzverschwendung? & komische adresse



  • hi ich habe zwei fragen zu den makierten stellen auf dem bild:
    http://imageshack.us/photo/my-images/849/unbenanntzu.jpg/

    1. in der ersten zeile der konsolenausgabe soll am anfang die adresse von dem char c stehen.
    warum sieht die so aus?

    eigendlich wollte ich über die bits des chars iterieren, habe aber festgestellt, dass ein bool gleich einem char ist und immer ein byte platz verschwendet (ein bool wird mir als zweistellige hexerdezimalzahl ausgegeben....).

    ist das nicht platzverschwendung?
    ich verbrauche den 8-fachen speicher meiner eigendlichen daten.
    ich könnte es ja verstehen, wenn es bei einzelnen bools so wäre (halt minimale speicherblockgröße), aber ein boolarray mit 80000 elementen braucht dann auch 80000 byte speicher, obwohl auch 10000 byte ausreichen würden.
    gibt es für solche bitfelder eigebdlich eine implementation?



  • wsx schrieb:

    1. in der ersten zeile der konsolenausgabe soll am anfang die adresse von dem char c stehen.
    warum sieht die so aus?

    Weil es in C++ eine Sonderregel für Adressen von char (=Zeiger auf char) gibt. Zeiger auf char werden angenommen als Start eines String-Literals wie "hallo". Wenn man "hallo" an eine Funktion übergibt, wird die Adresse des ersten char also von diesem 'H' nur übergeben und normale "anständige, höfliche, christliche, aufrichtige" Funktionen gehen davon aus, daß damit ein String gemeint ist, und zum Beispiel der op<< gibt dann alle Zeichen von da ab aus bis ein char(0) kommt. Mit char(0) (andere Schreibweise z.B. '\0') ist da das Zeichen für Stringende. "hallo" ist in Wirklichkeit 'h','a','l','l','o','\0'

    wsx schrieb:

    eigendlich wollte ich über die bits des chars iterieren, habe aber festgestellt, dass ein bool gleich einem char ist und immer ein byte platz verschwendet (ein bool wird mir als zweistellige hexerdezimalzahl ausgegeben....).

    Er sollte als 0 oser 1 ausgegeben werden. Aber innendrin hat er sicher immer mindestens 8 bit.

    wsx schrieb:

    ist das nicht platzverschwendung?

    Muß leider sein, damit zwei verschiedene bools auch zwei verschiedene Adressen haben. Normale Rechner können von der Hardware her nur ganze Bytes adressieren.

    wsx schrieb:

    ich verbrauche den 8-fachen speicher meiner eigendlichen daten.

    Jup. Und das ist gut. Schon in der 80-er Jahren des vergangenden Jahrhunderts war es so, daß das Speichersparen hier, wenn man mehrere Wahrtheitswerte in ein Byte sperrt, und man dafür Geschwindigkeit bezahlen muß, was man nunmal muß, um Einzelbits wieder zu extrahieren, daß das Speichersparen den Geschwindigkeitsnachteil nicht wert war.

    wsx schrieb:

    ich könnte es ja verstehen, wenn es bei einzelnen bools so wäre (halt minimale speicherblockgröße), aber ein boolarray mit 80000 elementen braucht dann auch 80000 byte speicher, obwohl auch 10000 byte ausreichen würden.
    gibt es für solche bitfelder eigebdlich eine implementation?

    Ja!!!!!
    Ach, komm, da muß ein !!einself!! her.
    vector<bool> macht genau die Optimierung, die Du wünscht.
    vector<irgendwas> ist normal.
    Extra für vector<bool> und nur dafür gibt es eine Ausnahme.
    Seit den 80-er....
    Also man weiß, daß es Quatsch ist.
    Diese "Optimierung" ist auch in der C++-Gemeinde nicht beliebt. Ist aber so.



  • Dass eine Variable vom Typ bool 1 byte Speicher braucht ist hardwarebedingt. Die meistens Memories sind byte-addressable, das heisst es koennen nur einzelne bytes adressiert werden.

    Du kannst dir mal std::bitset anschauen, das verschwendet keinen Platz. Dafuer ist es etwas langsamer.



  • Wenn es Dir ums 80er-Jahre Speichersparen geht, kannst Du vielleicht auch einen 80er-Jahre Microcontroler nehmen. Die haben teilweise Flagspeicher gehabt, der Bitadressierbar war.


Log in to reply