Seite 1 von 1

Speicherverbrauch Klasse->Struct

Verfasst: Mo Jan 30, 2012 9:39 pm
von Leverator
Hallo zusammen,

mich interessiert die Frage, wie man mit etwas größeren Datenmengen besser umgeht.

Variante 1, die mir eingefallen ist:

Code: Alles auswählen

struct meineStruct {
  meinDatenHaufen a;
  integers b;
  und so weiter c;
};

Code: Alles auswählen

class test1 {
  ...
  verarbeiteDaten( *meineStruct s) {
    ... tu irgendwas mit dem Haufen Daten ...
  }
};

Code: Alles auswählen

test1 ameise;
for( int i=0; i<max; i++)
  ameise.verarbeiteDaten( datenhaufen[i] );
Variante 2 beinhaltet die Daten aus der struct direkt in der Klasse:

Code: Alles auswählen

class test2 {
private:
  meinDatenHaufen a;
  integers b;
  und so weiter c;

  verarbeiteDaten() {
    ... tu irgendwas mit dem Haufen Daten ...
  }
};

Code: Alles auswählen

test2 ameise[max]; ( natürlich richtig initializieren )
for( int i=0; i<max; i++) ameise[i].verarbeiteDaten();
Und nun die goldene Frage:
Welche Lösung verbraucht weniger Speicherplatz?
Ich vermute Lösung 1, weil ich die Informationen der Strukt ohne den Prozeduren der Klassenbibliothek in eine Liste packen kann. In der Lösung 2 wäre halt der Overhead der Klasse mit dabei.


Was denkt Ihr?

Grüße,
Lev

Re: Speicherverbrauch Classe->Struct

Verfasst: Mo Jan 30, 2012 9:44 pm
von Xin
Eine Klasse ist eine semantische Definition, die nach dem Kompilieren vollständig verloren geht. Sie dient nur Deiner Übersicht, ansonsten sind beide Lösungen im Speicherverbrauch identisch.

Wichtigster Grund Lösung zwei zu favorisieren ist, dass eine Klasse Daten kapseln sollte und die Methoden, wie diese Daten verarbeitet werden. Lösung 2 ist also gutes Softwaredesign, Lösung 1 ist... Gefrickel umschreibt es wohl am Besten. :-)

Re: Speicherverbrauch Klasse->Struct

Verfasst: Mo Jan 30, 2012 9:48 pm
von Leverator
Und ich dachte, daß ich im Beispiel 2 auch den Platzverbrauch für die Prozeduren mitrechnen müsste, sodaß das bei entsprechend vielen Daten schon merklich am RAM nagt.

Aber gut zu wissen daß dem nicht so ist.


Danke für die schnelle Antwort,
Lev

Re: Speicherverbrauch Klasse->Struct

Verfasst: Mo Jan 30, 2012 10:09 pm
von cloidnerux
Und ich dachte, daß ich im Beispiel 2 auch den Platzverbrauch für die Prozeduren mitrechnen müsste
Prozeduren verbrauchen wenig Ram, da alles was du mühevoll programmierst durch den Compiler in einen Haufen Maschinencode umgewandelt wird. Dieser steht also immer Fest und macht selbst bei extrem großen Programmen nicht mehr als ein paar Megabyte aus(ausgenommen *.dlls, große Bibliotheken.)
Wirklich platz brauchen dann nur noch die Daten, wobei du das immer Relativ betrachten musst.
10.000 Ints brauchen 39 MB als Array im Ram, ich hab in meinem Computer 8GB an Arbeitsspeicher und damit wären die 39 MB gerade mal 0,47%.
10000 Datensätze eines Structs mit 40 Byte/Struct wären schon 390MB, aber trotzdem nur 4,7% meines Computers.

Wenn du also deine Datenstrukturen Optimieren willst, musst du zusehen das du weniger Informationen benötigst oder die Vorhandenen Informationen besser speicherst, z.B kleinere Datentypen verwendest.
Willst du einen Prozess Optimieren, so musst du zusehen, dass dein Algorithmus weniger machen muss, z.B durch effizientere Verarbeitung, Nutzung von Prozessoreigenen Funktionen oder was einem Sonst noch so einfällt.

Re: Speicherverbrauch Klasse->Struct

Verfasst: Mo Jan 30, 2012 10:22 pm
von Xin
cloidnerux hat geschrieben:10.000 Ints brauchen 39 MB als Array im Ram, ich hab in meinem Computer 8GB an Arbeitsspeicher und damit wären die 39 MB gerade mal 0,47%.
10000 Datensätze eines Structs mit 40 Byte/Struct wären schon 390MB, aber trotzdem nur 4,7% meines Computers.
Ich habe auch 8GB bei mir. Bei mir sind 10000 ints nur 40000 Bytes und 10000 Datensätze mit je 40 Byte nur 400.000 Bytes.
Da zeigt sich doch, dass sich Markenspeicher doch rentiert ;-D

Re: Speicherverbrauch Klasse->Struct

Verfasst: Mo Jan 30, 2012 10:26 pm
von cloidnerux
Ich habe auch 8GB bei mir. Bei mir sind 10000 ints nur 40000 Bytes und 10000 Datensätze mit je 40 Byte nur 400.000 Bytes.
Da zeigt sich doch, dass sich Markenspeicher doch rentiert ;-D
Wie war das: 1km = 1000m und 1kByte = 1024 byte?
Aber du hast Recht, ich hab mich im Präfix geirrt^^

Re: Speicherverbrauch Klasse->Struct

Verfasst: Di Jan 31, 2012 10:08 am
von Panke
Methoden werden genau einmal im Speicher abgelegt, nicht einmal pro Objekt. Pro Objekt kommt dann noch
ein Zeiger auf die vtable hinzu, aber nur wenn du Polymorphie nutzt.Wichtig auch: Zwischen class und struct
besteht nur ein Unterschied in der standardmäßigen Sichtbarkeit (private vs public).

Re: Speicherverbrauch Klasse->Struct

Verfasst: Do Feb 02, 2012 7:23 pm
von AnGaiNoR
cloidnerux hat geschrieben: Wie war das: 1km = 1000m und 1kByte = 1024 byte?
Nö, 1 kB = 1000 B. Der SI-Präfix "Kilo" bedeutet nunmal tausend, nicht mehr und nicht weniger. ;-)
Aber 1KiB = 1024 B, nennt sich "Kibibyte". Entsprechend dann MiB - Mibibyte, GiB - Gibibyte...

Re: Speicherverbrauch Klasse->Struct

Verfasst: Do Feb 02, 2012 7:35 pm
von cloidnerux
Nö, 1 kB = 1000 B. Der SI-Präfix "Kilo" bedeutet nunmal tausend, nicht mehr und nicht weniger.
Aber 1KiB = 1024 B, nennt sich "Kibibyte". Entsprechend dann MiB - Mibibyte, GiB - Gibibyte...
Ein wenig Geschichte:
Bis 1996 verwendete man die dezimalen Präfixe für die Bezeichnung der Speichermengen, aber im Binären Kontext, also 1kB = 1024 byte. Da dies aber Verwirrend war, schlug man das mit den KiB und MiB usw vor, dies wurde aber nicht überall eingehalten bzw genutzt.
Heutzutage ist es bei den Firmen so, dass sie die SI-Präfixe in ihrer dezimalen Bedeutung nutzen, also 1TB = 10^12Byte, Windows hingegen verwendet die Präfixe in Binärer Bedeutung: 1TB = 2^40 Byte.
Bei Mac setzt man ganz auf Dezimale angaben, bei Linux kann man wählen und die Programmierer nehmen was ihnen passt.