Technipion
Erfahrenes Mitglied
Hallo Welt,
ich habe gerade einen Codeschnipsel geschrieben, in dem ich mit std::vector<bool> gearbeitet habe. Im Stile des Clean Code und natürlich 100% C++14-konform
habe ich dabei an diversen Stellen size_t benutzt.
Der Typ von size_t ist ja laut Standard so definiert,
dass die Größe eines jeden Objektes in Bytes damit gemessen werden kann. Auf der anderen Seite ist std::vector<bool> so definiert,
dass die Speicherung einzelner boolean-Werte in ihrem Platzbedarf soweit wie möglich optimiert werden kann. Meiner Erfahrung nach macht g++ das auch: Wenn ich 500 Wahrheitswerte speichere, beträgt der notwendige Speicherplatz nur etwa 64 Bytes.
Jetzt kam mir natürlich eine Frage in den Sinn. Wenn ich ein bestimmtes Bit über den []-Operator abfrage, benutze ich einen Index vom Typ size_t. Allerdings garantiert size_t mir ja nur, jedes Byte des Containers adressieren zu können.
Ich weiß dass es auf einem "normalen" 64-Bit System und "sinnvoll" gewähltem size_t (z.B. unsigned long) praktisch kein Problem geben sollte. Aber zumindest theoretisch könnten einem bei std::vector<bool> doch die Adressen ausgehen, oder?
Habt ihr vielleicht irgendwelches Background-Wissen oder Vermutungen dazu?
Und ja, ich weiß dass std::vector<bool> ziemlich verhasst ist. War aber für meinen Anwendungsfall einfach perfekt.
Gruß Technipion
ich habe gerade einen Codeschnipsel geschrieben, in dem ich mit std::vector<bool> gearbeitet habe. Im Stile des Clean Code und natürlich 100% C++14-konform

Der Typ von size_t ist ja laut Standard so definiert,
http://www.cplusplus.com/reference/cstring/size_t/Unsigned integral type
Alias of one of the fundamental unsigned integer types.
It is a type able to represent the size of any object in bytes: size_t is the type returned by the sizeof operator and is widely used in the standard library to represent sizes and counts.
In <cstring>, it is used as the type of the parameter num in the functions memchr, memcmp, memcpy, memmove, memset, strncat, strncmp, strncpy and strxfrm, which in all cases it is used to specify the maximum number of bytes or characters the function has to affect.
It is also used as the return type for strcspn, strlen, strspn and strxfrm to return sizes and lengths.
dass die Größe eines jeden Objektes in Bytes damit gemessen werden kann. Auf der anderen Seite ist std::vector<bool> so definiert,
http://www.cplusplus.com/reference/vector/vector-bool/Vector of bool
This is a specialized version of vector, which is used for elements of type bool and optimizes for space.
It behaves like the unspecialized version of vector, with the following changes:
- The storage is not necessarily an array of bool values, but the library implementation may optimize storage so that each value is stored in a single bit.
dass die Speicherung einzelner boolean-Werte in ihrem Platzbedarf soweit wie möglich optimiert werden kann. Meiner Erfahrung nach macht g++ das auch: Wenn ich 500 Wahrheitswerte speichere, beträgt der notwendige Speicherplatz nur etwa 64 Bytes.
Jetzt kam mir natürlich eine Frage in den Sinn. Wenn ich ein bestimmtes Bit über den []-Operator abfrage, benutze ich einen Index vom Typ size_t. Allerdings garantiert size_t mir ja nur, jedes Byte des Containers adressieren zu können.
Ich weiß dass es auf einem "normalen" 64-Bit System und "sinnvoll" gewähltem size_t (z.B. unsigned long) praktisch kein Problem geben sollte. Aber zumindest theoretisch könnten einem bei std::vector<bool> doch die Adressen ausgehen, oder?
Habt ihr vielleicht irgendwelches Background-Wissen oder Vermutungen dazu?
Und ja, ich weiß dass std::vector<bool> ziemlich verhasst ist. War aber für meinen Anwendungsfall einfach perfekt.
Gruß Technipion