Speicherverbrauch Klasse->Struct

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Leverator
Beiträge: 37
Registriert: Mo Jan 30, 2012 9:28 pm
Wohnort: ::1

Speicherverbrauch Klasse->Struct

Beitrag von Leverator » Mo Jan 30, 2012 9:39 pm

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

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Speicherverbrauch Classe->Struct

Beitrag von Xin » Mo Jan 30, 2012 9:44 pm

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. :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Leverator
Beiträge: 37
Registriert: Mo Jan 30, 2012 9:28 pm
Wohnort: ::1

Re: Speicherverbrauch Klasse->Struct

Beitrag von Leverator » Mo Jan 30, 2012 9:48 pm

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

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Speicherverbrauch Klasse->Struct

Beitrag von cloidnerux » Mo Jan 30, 2012 10:09 pm

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Speicherverbrauch Klasse->Struct

Beitrag von Xin » Mo Jan 30, 2012 10:22 pm

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
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Speicherverbrauch Klasse->Struct

Beitrag von cloidnerux » Mo Jan 30, 2012 10:26 pm

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^^
Redundanz macht wiederholen unnötig.
quod erat expectandum

Panke
Beiträge: 70
Registriert: So Nov 14, 2010 10:47 am

Re: Speicherverbrauch Klasse->Struct

Beitrag von Panke » Di Jan 31, 2012 10:08 am

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).

AnGaiNoR
Beiträge: 212
Registriert: Sa Jul 19, 2008 7:07 pm
Wohnort: Dresden

Re: Speicherverbrauch Klasse->Struct

Beitrag von AnGaiNoR » Do Feb 02, 2012 7:23 pm

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...
Physics is like sex: sure, it may give some practical result, but that's not why we do it.
(Richard P. Feynman)

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Speicherverbrauch Klasse->Struct

Beitrag von cloidnerux » Do Feb 02, 2012 7:35 pm

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten