Speichergröße bool array <-> char array
-
Hallo zusammen,
ich hantiere gerade mit mehreren größeren Arrays herum und der Arbeitsspeicher wird knapp. Daher mal eine grundsätzliche Frage:
Welchen Speicherplatz benötigt ein bool-Array?
Spare ich hier Speicher gegenüber einem char-array?In Büchern &Co. werden für alle Datentypen die benötigten Bits beschrieben nur eben nie für bool.
Der Horst
-
Der Arbeitsspeiocher wird knapp? Bist du sicher? Naja ich denke, dass die Größe mit der Arraygröße zutun hat.
Eine Variable vom Typ bool braucht ein Byte!
lg, freakC++
-
bool-array braucht 1 byte pro bool.
aber vector<bool> braucht (magie im spiel) 1 bit pro bool.
-
DerHorst schrieb:
Hallo zusammen,
ich hantiere gerade mit mehreren größeren Arrays herum und der Arbeitsspeicher wird knapp. Daher mal eine grundsätzliche Frage:
Welchen Speicherplatz benötigt ein bool-Array?
Spare ich hier Speicher gegenüber einem char-array?In Büchern &Co. werden für alle Datentypen die benötigten Bits beschrieben nur eben nie für bool.
Der Horst
Wieviel bool braucht, ist plattformabhängig.
std::cout << sizeof(bool) << '\n';sagt Dir mehr.
-
Ja, der Arbeitsspeicher wird leider wirklich knapp.
(so lange ich noch auf 32 bit tippe)Vielen Dank für die Hilfe und die vector<bool> = 1byte->1bit "Zauberei"
Das wir ne Menge Platz schaffen
Der Horst
-
DerHorst schrieb:
Ja, der Arbeitsspeicher wird leider wirklich knapp.
(so lange ich noch auf 32 bit tippe)Vielen Dank für die Hilfe und die vector<bool> = 1byte->1bit "Zauberei"
Das wir ne Menge Platz schaffen
Der Horst
Gibt auch noch std::bitset falls du das nicht schon kennst.
-
@ Tippgeber:
nö, std::bitset kenne ich nicht.
-

-
als könnte ich mit mit:
#include <bitset> ... const int N=1; vector <bitset<N>> A; ...einen Vektor deklarieren, dessen Elemente nur ein bit groß sind?
-
DerHorst schrieb:
als könnte ich mit mit:
#include <bitset> ... const int N=1; vector <bitset<N>> A; ...einen Vektor deklarieren, dessen Elemente nur ein bit groß sind?
Dein, mit
std::bitset<24> setlegst Du ein Bitset an, welches 24 Bits hält.
Leider lässt sich das Bitset während der Laufzeit nicht dynamisch erweitern.
-
ok, bitset scheint mir da nicht so praktisch. Dann nehme ich lieber die Variante mit vector<bool> zur Definition des Arrays.
Danke nochmal an alle!
DerHorst
-
DerHorst schrieb:
als könnte ich mit mit:
#include <bitset> ... const int N=1; vector <bitset<N>> A; ...einen Vektor deklarieren, dessen Elemente nur ein bit groß sind?
Unfug.
vector<bool> braucht für 100 bools erstmal 12.5 bytes, nee, 13 natürlich, muß ja aufrunden, und natürlich 32 bytes, das ist ja die allocation granularity. und dazu noch mindestens 16 bytes für das mutterobjekt.
kein gedanke daran, daß EIN EINZIGER bool NUR EIN BIT braucht.
aber 1000000000 bools brauchen halt nur 125000000 Bytes, evtl auf den nächsten 32-er gehen wegen granularity und internen heapzeigern, 125000032 bytes, noch großzügig 32 bytes für den vector, 125000064 bytes, macht 1,000000512 bit pro bool.
bitset hat nicht so <ironie>wahnsinnig viel overhead von dutzenden von bytes</ironie>. aber ist dafür nicht so klug wie ein vector und weiß nichst von dynamischen größen.
-
std::vector<bool>ist sowieso nicht so ganz das Wahre, siehe zum Beispiel http://www.gotw.ca/publications/N1211.pdf.
-
Darf ich beim Threadersteller anfragen, was er überhaupt vorhat, dass er so viel Speicher benötigt? Erfahrungsgemäß ist das bei den meisten, die hier fragen eher ein Designproblem und kein echter Speicherplatzmangel.
-
Es geht um sehr große arrays (Bilder), die ich auf vielfältige Weise untersuchen will.
Die Quelldaten sind etwa (400MB) groß und ich muss mehrere gleichzeitig verarbeiten (mindestens 2, besser mehr).Für diese Untersuchungen brauche ich halt verschiedene Arrays (gleichzeitig), um pixelbezogene Ereignisse abzufragen.
Jedenfalls ist mir noch nichts gescheiteres (als ein weiteres Array in Bilddimensionen) eingefallen, um ein pixelbezogenes Ereignis zu speichern.DerHorst
-
DerHorst schrieb:
Es geht um sehr große arrays (Bilder), die ich auf vielfältige Weise untersuchen will.
Die Quelldaten sind etwa (400MB) groß und ich muss mehrere gleichzeitig verarbeiten (mindestens 2, besser mehr).Für diese Untersuchungen brauche ich halt verschiedene Arrays (gleichzeitig), um pixelbezogene Ereignisse abzufragen.
Jedenfalls ist mir noch nichts gescheiteres (als ein weiteres Array in Bilddimensionen) eingefallen, um ein pixelbezogenes Ereignis zu speichern.DerHorst
Vielleicht geht es ja auch mit blockweiser Verarbeitung. Also immer einen Block Daten einlesen, diesen verarbeiten, und ihn dann wieder hinausschreiben.
-
Das wollte ich vermeiden.
Aber mal schauen. Evtl. muss ich es halt stückeln.
-
DerHorst schrieb:
Das wollte ich vermeiden.
Das ist aber bei größen Datenmengen der optimale Ansatz.
-
DerHorst schrieb:
Das wollte ich vermeiden.
Aber mal schauen. Evtl. muss ich es halt stückeln.Ich wollte mal mit dem Sieb des Eratosthenes viele Primzahlen ausrechnen. Ich habe auch sowas gepacktes wie vector<bool> genommen. Und ich habe gestückelt. Stückeln ist natürlich doof, weil ich für jedes neue Stück wieder alle Streichzahlen von 2 bis ... durchlaufen mußte. Also lautete die Devise: "So wenig Stücke wie möglich". War aber ganz falsch. Lustigerweise war das Programm am schnellsten, wenn ein Stück in den Cache gepaßt hat, also was minikleines wie 64k. Also obwohl dadurch viel mehr Operationen ausgeführt werden mußten, hat einfach die Schnelligkeit des Caches am Ende die ganzen Performanceüberlegungen dominiert. Da wünsch ich Dir mal viel Glück, daß Deine Berechnungen auch gut stückelbar sind.

-
auch ne gute Idee mit dem Cache -
mal schauen. wenn ich es hinbekomme und versuche ich mal nen Vergleich zu starten.und los ...
-
DerHorst schrieb:
Für diese Untersuchungen brauche ich halt verschiedene Arrays (gleichzeitig), um pixelbezogene Ereignisse abzufragen.
Jedenfalls ist mir noch nichts gescheiteres (als ein weiteres Array in Bilddimensionen) eingefallen, um ein pixelbezogenes Ereignis zu speichern.DerHorst
Vielleicht könntest du ein Array einer Bitfield-Struct verwenden um Platz zu sparen (statt mehrere bool Arrays):
struct PixelProperties { unsigned char isX : 1; unsigned char isY : 1; unsigned char fooType : 2; unsigned char barType : 2; }; std::vector<PixelProperties> pixelProps;Würden den Lookup vermutlich unglaublich beschleunigen.