PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C# - Was passiert im Speicher beim Erstellen eines Objektes


no idea
2009-10-30, 18:22:23
Kann mir jemand beschreiben was im Speicher passiert beim erstellen eines neuen Objektes einer Klasse?

Also z.b. bei:

Class Klasse = new Class;

Was passiert genau bei "Class Klasse" und was bei "new Class";
WO wird der Speicher allokiert?
Was passiert im Heap, was im Stack?
Gibt es hierbei einen unterschied zwischen normalen Klassen und Datentypen, die ja auch nur eine Klasse sind?



Ich habe das anhand meiner sehr wenigen Quellen wie folgt verstanden:

"Class Klasse"
Im Heap wird ein NULL Zeiger erstellt.


"new Class"

1. Der Speicher im Stack für die Werte des Objektes werden allokiert. Gesamtgröße: 32/64bit
2. Der Heap Zeiger zeigt nun auf die Anfangsadresse des allokierten Speichers im Stack
3. Eine Instanz des Objektes wird erzeugt.

Monger
2009-10-30, 18:49:15
Gibt es einen konkreten Grund weshalb du fragst? Ich frage nur, weil solche Fragen oftmals kommen, wenn jemand versucht "Pi mal Daumen" den Speicherverbrauch einer Anwendung zu schätzen.

PatkIllA
2009-10-30, 19:09:12
Bei deiner Auflistung für "new Class" bringst du Heap und Stack durcheinander. Das allokieren gegenüber dem OS macht auch schon die .NET Umgebung und das auch in größeren Blöcken. Der Speicher kann auch schon mal umsortiert werden und auch das zur Archtitektur passende Alignment wird gewählt. Ein 3 Byte großes Objekt wird wahrscheinlich effektiv mehr belegen.
Dazu kommt noch der ganze Verwaltungsaufwand für die Garbage Collection. Der entfällt bei Value Types. Je nach Größe und Anzahl kann man sich Gedanken machen structs zu verwenden.
Da wird der Stack benutzt und per value kopiert.
Und auch ValueTypen landen natürlich auf dem Heap wenn es sich um Member variablen einer Klasse handelt.

Monger
2009-10-31, 00:24:34
Mal so ganz grob gesagt: Value Types landen auf dem Stack, Objekte auf dem Heap. Wobei es wohl auch so ist, dass der Stack schneller Probleme macht wenn er allzu groß wird... weshalb auch Microsoft selbst empfiehlt, Structs nicht allzu komplex werden zu lassen.

Wie die Runtime das aber konkret implementiert, ist afaik nicht öffentlich dokumentiert. Ist auch im Endeffekt müßig, weil bei einem halbwegs komplexen Programm das sowieso nicht mehr vernünftig berechenbar, sondern nur messbar ist. Insbesondere der Speicherverbrauch eines Programms ist völlig schnurzpiep egal, solange du ausreichend Speicher frei hast.

no idea
2009-11-01, 01:43:17
vielen dank für eure antworten.
habe auch einen guten link zu dem thema gefunden:

was ich mich aber nun frage ob auf das objekt, welches sich im heap aufhält, ein zeiger gesetzt wird und ob dieser im stack liegt?

Trap
2009-11-01, 02:19:11
Fürs Erstellen von Objekten ist die .NET-VM zuständig und ich glaube nicht, dass spezifiziert ist, wie die VM die Objekte anlegen muss.

Im Zweifelsfall kann sie die Objekte auch Ausdrucken ;)

PatkIllA
2009-11-01, 08:39:25
Der Zeiger kann auch genauso gut wieder im Heap liegen, wenn die Referenz in einer Member Variablen gespeichert wird. Und ich bin auch nicht sicher, ob das wirklich bei jeder CLR gleich ist. Plus halt der Overhead für die Garbage Collection.
Enstand die Frage aus einer konkreten Situation oder ist es nur Neugierde?

Ich kann noch folgende Blogs empfehlen, die sich mit interna zu .Net beschäftigen
Fabulous Adventures In Coding (http://blogs.msdn.com/ericlippert/")
Rico Mariani's Performance Tidbits (http://blogs.msdn.com/ricom/)