Kleiner Datentyp gesucht bzw. programmieren
-
Hi,
ich muss in meinem Programm ein Feld aus 1 000 000 Variablen verwalten, dabei kommen für eine Variable nur 4 versch. Werte in Frage, würde ich ein int nehmen ( bei mir 32 Bit ) wären das 4 Mb, bei char immernoch 1 Mb, da aber nur 4 Werte in Frage kommen wäre ein 2 Bit grosser Datentyp am optimalsten.
Wie definiere ich einen solchen Datentyp ? Ich habe schon Bitfelder versucht, und auch bei enums optimiert mein Compiler nicht auf Grösse, somit gibt folgendes Programm immer 4 Byte als Grösse aus.
Aber das muss doch irgendwie gehen, oder ?#include <iostream.h> enum test { val=1, qwe=2, asd=3 }; // dürften 2 bit ausreichen struct small { int : 2; }; int main() { cout << sizeof(int) << endl; cout << sizeof(test) << endl; cout << sizeof(small) << endl; int a; test b; small c; small d[1111]; cout << sizeof(a) << endl; cout << sizeof(b) << endl; cout << sizeof(c) << endl; cout << sizeof(d) << endl; cin.get(); return 0; }
thx
-
schreib dir doch eine klasse mit 2 Bools.
Dann machst du davon 4 Konstante Globale Klassen(für jede möglichkeit eine), und nutzt die für vergleiche. Operatoroverloading ist da nützlich...
-
thx, das werde ich dann mal so machen.:)
-
nur das es sehr unwahrscheinlich ist das ein bool ein bit gross ist :p in den meisten fällen dürfte es gleich gross sein wie ein char.
eine andere möglichkeit wäre es mit masken etc. auf die werte zuzugriefen d.h. 4 werte in einem char speichern
-
1MB ist ja auch nicht so viel!
-
achja da es noch keiner gemerkt hat:
benutz lieber iostream anstatt iostream.h
-
mit 1 Mb bekomm ich schon nen Stackoverflow, ausserdem sollen diese Daten dann auch abgespeichert werden und da sollten die Dateien möglichst klein sein und z.Z. hab ich es noch auf 1000*1000 begrenzt,
aber wenn ich die Daten kleiner bekomme dann würde ich dieses Limit auch höher ansetzen.@japro
ja ich weiss, in meinem Projekt benutze ich auch die Std.-Header ohne *.h.Meinst du mit Masken mehrere Informationen in einem int unterzubringen ? Mal sehen ob ich das mit Bitfeldern hinbekomme.
-
1mio Elemente haut man auch auf den Heap und nicht auf den Stack!
naja, und ob man 1MB oder 500KB grosse Dateien hat, ist schon fast egal...
wenn du wirklich mit einzelnen bits arbeiten wuerdest, waere das doch recht lahm, und ich denke nicht, dass es das wert ist, oder?
-
was hälst du davon mehrere Werte in einer Struct zu speichern
struct Struktur { char a : 2; char b : 2; char c : 2; char d : 2; };
-
Nur mal eine Frage, aber bevor ich zwei bools nehme die insgesamt 4 Schaltzustände repräsentieren können und 2Bytes benötigen nehm ich lieber einen char der 1Byte benötigt und 256 verschiedene Schaltzustände besitzt und damit auch noch erweiterbar ist
.
MfG SideWinder
-
class EnumFeld { vector<bool> data; ... int operator[](size_t index) { return 2*data[i]+data[i+1]; }
Aber 1MB ist doch nicht viel. Nimm einfach vector<char>, der legt mit new an und dan haste kein Stackproblem.
[ Dieser Beitrag wurde am 26.06.2002 um 18:34 Uhr von volkard editiert. ]
-
du kanns ja ein bool array benutzen beim arbeiten und beim speichern reduzierst du alles auf pro bool auf 1 bit, beim speichern bremst sowieso die hdd aus die paar bit operatioen stören dan nicht wirklich
-
wieso haben eingentlich einige die seltsame Idee bool belege nur 1Bit. Es gibt wohl kaum eine Plattform, die das so macht. Wahrscheinlicher ist mindestens ein Byte, wenn nicht ein Wort.
-
Original erstellt von Helium:
wieso haben eingentlich einige die seltsame Idee bool belege nur 1Bit. Es gibt wohl kaum eine Plattform, die das so macht. Wahrscheinlicher ist mindestens ein Byte, wenn nicht ein Wort.Es geht nicht um bool, der kann kaum kleiner als 1 byte sein, um noch adressierbar zu sein.
Wir reden von vector<bool>.
Das Fehlerchen ganz am Anfang dieses Threads ist verzeihbar.[ Dieser Beitrag wurde am 26.06.2002 um 19:02 Uhr von volkard editiert. ]
-
danke für die vielen anregungen aber mir ist gerade die Idee gekommen
da es mir hauptsächlich um den Plattenspeicher geht könnte ich das doch alles zippen, ich hab mir schon ein paar Scripts zum Huffmann Code gezogen.
-
Original erstellt von Real_PsychoDAD:
danke für die vielen anregungen aber mir ist gerade die Idee gekommen
da es mir hauptsächlich um den Plattenspeicher geht könnte ich das doch alles zippen, ich hab mir schon ein paar Scripts zum Huffmann Code gezogen.ich würde trozdem die bool in bits abbilden wenn du es abspeicherst
-
@volkard: Sollte man einen vector<bool> nicht eigentlich nicht verwenden um Platz für viele boolesche Werte zu machen? Da gibts doch so eine ungeeignete (bzw. nicht ungeeignet aber für andere Einsatzfälle gedachte) Implementierung, oder?
Ich bin weiterhin für std::vector<char> ... das kommt immer noch am besten und die ganze Sache ist leicht erweiterbar.
MfG SideWinder
-
Original erstellt von SideWinder:
@volkard: Sollte man einen vector<bool> nicht eigentlich nicht verwenden um Platz für viele boolesche Werte zu machen? Da gibts doch so eine ungeeignete (bzw. nicht ungeeignet aber für andere Einsatzfälle gedachte) Implementierung, oder?Hab die Frage nicht verstanden.
vector<bool> war doch das Ding, das Bitgepackt die Daten hält. Deswegen hat mein Code da oben nen Verbrauch von 2 Bits pro Wert.
Ich würde auch vector<char> bevorzugen.
-
Ja, das stimmt schon. Aber HumeSikkins hat mir einmal erklärt, dass man std::vector<bool> nicht verwenden soll um einen Vektor von boolschen Werten zu erstellen.
MfG SideWinder
-
Original erstellt von SideWinder:
**Ja, das stimmt schon. Aber HumeSikkins hat mir einmal erklärt, dass man std::vector<bool> nicht verwenden soll um einen Vektor von boolschen Werten zu erstellen.
**Jo, da stimm ich gerne zu. So allgemein.
-
@Dimah
Wie bildet man die bools den bitweise beim speichern ab,
also mit Strukturen und Bitfeldern bekomme ich es nicht hinNun wollte ich noch einen std::vector mehrdimensional machen nur irgendwie akzeptiert mein Compiler folgende Form nicht
std::vector<std::vector<char>> c;
sieht doch eigentlich korrekt aus ?: error C2146: Syntaxfehler : Fehlendes ',' vor Bezeichner 'c'
k:\vc6_projekte\mecharena\neu\01\map.h(58) : error C2065: 'c' : nichtdeklarierter Bezeichner
k:\vc6_projekte\mecharena\neu\01\map.h(58) : error C2143: Syntaxfehler : Fehlendes '>' vor ';'
k:\vc6_projekte\mecharena\neu\01\map.h(58) : error C2208: 'class std::vector' : Keine Elemente definiert, die diesen Typ verwenden