Speicherverwaltung in MS Visual Studio 6.0

Also, folgendes.

Wir definieren eine ganz einfache Klasse für eine einfach verkettete Liste mit nix drin.
Also enthält jedes Objekt nur eine Adresse (die des nächsten Elements).
mit dieser Klasse ziehen wir jetzt eine Liste auf.
So und jetzt das Problem:

bei z.B 1Million Elementen müsste der Speicherverbrauch doch 4Byte (Adresse) * 1Million = 4MB sein.
Ich hab 64MB verbraucht.
Wenn ich mir den Speicher anschaue, klafft zwischen jedem Eintrag eine
60 Byte breite Lücke mit immer den selben Werten (die für mich keinen Sinn machen).

Was mach ich denn falsch? Ich hab doch gar nix getan.
Liegt es villeicht an der Autorenversion, die ich benutze?

Danke schonmal für die eventuelle Hilfe

bei z.B 1Million Elementen müsste der Speicherverbrauch doch
4Byte (Adresse) * 1Million = 4MB sein.
Ich hab 64MB verbraucht.
Wenn ich mir den Speicher anschaue, klafft zwischen jedem
Eintrag eine
60 Byte breite Lücke mit immer den selben Werten (die für mich
keinen Sinn machen).

Ich denke das sind Verwaltungsinformationen über die Klasse, die zur Laufzeit benötigt werden, z.b. was für eine Klasse es ist usw.

Was mach ich denn falsch? Ich hab doch gar nix getan.
Liegt es villeicht an der Autorenversion, die ich benutze?

Nein, habe es gerade ausprobiert und kann es bestätigen.

Grüße
Bruno

Hallo Florian,

Also, folgendes.

Wir definieren eine ganz einfache Klasse für eine einfach
verkettete Liste mit nix drin.
Also enthält jedes Objekt nur eine Adresse (die des nächsten
Elements).
mit dieser Klasse ziehen wir jetzt eine Liste auf.
So und jetzt das Problem:

bei z.B 1Million Elementen müsste der Speicherverbrauch doch
4Byte (Adresse) * 1Million = 4MB sein.
Ich hab 64MB verbraucht.
Wenn ich mir den Speicher anschaue, klafft zwischen jedem
Eintrag eine
60 Byte breite Lücke mit immer den selben Werten (die für mich
keinen Sinn machen).

Was mach ich denn falsch? Ich hab doch gar nix getan.
Liegt es villeicht an der Autorenversion, die ich benutze?

Hier sind, genau genommen, drei oder vier Mechanismen am Werk:

  1. Die dynamische Speicher-Verwaltung (Heap, alloc(), usw.) belegt einige Bytes für die Verwaltung des Speicherblocks. Meist werden die Speicher-Blöcke als einfach vekettete Liste vom System verwaltet. Hinzu kommt oft noch ein Flag welches anzeigt ob der Block belegt ist.

  2. „Ganularity“. Die Speicher-Blöcke werden mit einer festgelegten Mindest-Blockgrösse, oder einem ganzzahligen Vielfachen davon, angelegt. Damit wird vor allem verhindert, dass freigegebene Mini-Blöcke zwischen zwei belegten Blöcken „eingeklemmt“ werden und wegen der zu kleinen Grösse nicht weiterverwendet werden können.

  3. Bei C++ müssen noch die Informationen über die Klasse und deren Methoden, des Objekts anbgelegt werden.

  4. Bei einem als Debug-Version compilierten Programm, können vor und nach dem eigentlichen Datenbereich noch etwa je 20 Byte liegen, welche dazu benuzt werden zu erkennen wenn über den Datenbereich hinaus-geschrieben wurde.

MfG Peter(TOO)