Speicherverschwendung umgehen
-
mir sind in C++ zwei stellen aufgefallen, wo extrem viel Speicher verschwendet wird.
Array aus bool Variablen. Der kleinste adressierbare Speicher ist ja 1 byte, obwohl hier nur das erste bit gebraucht wird. Legt man aber ein Array an, so Vermehrt sich der Verschwendete Speicher dem entsprechend. Wie ist die Beste möglichkeit diese Verschwendung entgegenzukommen?
ein enum belegt immer 16/32/64 bit (integer größe). Die Platzverschwendung kommt hier auch erst richtig zur geltung, wenn man ein 64 bit Prozessor hat, und ein Feld dieser enums anlegt. Ich persönlich hab noch nie ein enum mit mehr als 256 einträgen gesehen, also wiso wird da so viel Platz veschenkt, der nie gebraucht wird? Kann man irgendwie auch die enums so ändern, dass sie nurnoch ein byte belegen?
-
ad 1: Du schreibst dir 'ne eigene Klasse als repräsentation eines bool-Arrays und verwendest jedes Bit deiner Daten als einen bool.
ad 2: Nein.
Greetz, Swordfish
-
Bei dem, was in heutigen Rechnern an Speicher steckt, ist es i. d. R. egal, ob
hier und da ein paar Byte "verschwendet" werden. Schon vor dem Hintergrund, dass
die Speicherverwaltung vom OS einem Programm sowieso nur Speicher in fest
definierter Größe (zu Portionen von z.B. 4KB, Stichworte: Paging, virtual
memory) zuweisen kann. Und dann ist es eh egal, ob dein Prog. davon nur 20 Byte
wirklich braucht, oder mal eben so ein paar 100 "verschwendet".Ausserdem heisst enum ja nicht unbedingt, dass es bei 0 zu zählen anfangen muss.
Denkbar wäre es auch denkbar, irgendwelche Bitmasken abzulegentypedef enum { FOO = 0xFF00FF00, BAR, FOOBAR }masks;Sind nur 3 Konstanten, es werden aber trotzdem jeweils 32 Bit benötigt.
-
Swordfish schrieb:
ad 1: Du schreibst dir 'ne eigene Klasse als repräsentation eines bool-Arrays und verwendest jedes Bit deiner Daten als einen bool.
Oder man nimmt einfach std::vector<bool>.
-
Swordfish schrieb:
ad 1: Du schreibst dir 'ne eigene Klasse als repräsentation eines bool-Arrays und verwendest jedes Bit deiner Daten als einen bool.
Dafür gibts Bitsets.
std::vector<bool> ist zwar auch für diesen Fall spezialisiert, allerdings saulahm.
-
@ Walli & Michael E.: *mich_am_kopf_kratz* *kopf_auf_schreibtisch_schleuder* ...

Greetz, Swordfish
-
Swordfish schrieb:
@ Walli & Michael E.: *mich_am_kopf_kratz* *kopf_auf_schreibtisch_schleuder* ...

Greetz, Swordfish
SCNR:
<nelson> haha </nelson>
:p

BR
Vinzenz
-
nelson?
Greetz, Swordfish
-
-
Ah, danke! (Mann bin ich blöd.)
Greetz, Swordfish
-
Enums sind sowieso keine Speicherverschwendung.
Sie verbrauchen ja keinen dynamischen Speicher, da die Werte im binary stehen.
Bei einer Zuweisung bleibt es ja dir überlassen welchem Typ du das enum zuweist.char value = ENUM_VALUE; int intValue = ENUM_VALUE;
-
du meinst also ich kann wenn ich ein enum {OBEN,UNTEN,LINKS,RECHTS}; hab, auf einen char LINKS zuweisen. also:
char a = LINKS; oder hab ich das jetzt falsch verstanden?
-
Ja. Wie sinnvoll das allerdings ist, sei mal dahingestellt.