Objekte auf stack doer heap?



  • Hallo leute,

    Bin eigentlich pure C/C++ Programmierer, aber durch das WCF gedöns hab ich mich seit ner woche mit .NET beschäftigt. Soviel ich weis hat .NET sowie Java nen Garbage Collector, welcher mit die Objekt im speicehr automatisch am leben hält solange ich sie brauche.

    1. Nun, mir ist aufgefallen das ich hier bei C# alle objekte mit new anlegen muss, werden diese dann immer aufm Heap angelegt? kann ich keine Objekte aufm Stack anlegen?

    MyClass obj = new MyClass();
    

    kann ich nun das obj als Pointer (c++ like) sehen? denke schon.

    3. Ich kann ja nen Destruktor implementieren ~MyClass(){...}; was hat der für nen sinn wenn ich nen Garbage Collector habe?

    4. Gibt es ne Möglichkeit die Lebensdauer ohne Garbage Collektor zu verwalten?



    Nein, Objekte von Reference Types (Klassen) landen immer aufm Heap, Objekte von Value Types (Strukturen z.B.) landen aufm Stack. Der Typ bestimmt in .Net wo er landet, es gibt keine Möglichkeit für den Programmierer zu entscheiden wo er das Objekt jetzt gerne hätte.

    Naja, es ist eine Referenz und kein Zeiger. Es fehlt Zeigerarithmetik und das ganze andere unsichere Zeug.

    Jein, Es sieht aus wie ein Destruktor, wird in der MSDN sogar so genannt, aber technisch gesehen ist es keiner. Es gibt keine Möglichkeit den Destruktor manuell aufzurufen. Ein Destruktor macht nur Sinn wenn man auch IDisposable implementiert und somit unverwaltete Resourcen hat. Im Destruktor ruft man einfach, falls noch nicht geschehen, die Dispose Methode auf um unmanaged Resourcen freizugeben, mehr nicht. Der GC schaut beim zerstören der Objekte ob ein Destruktor vorhanden ist, falls ja, ruft er diesen auf und makiert da sObjekt dass er es beim nächsten mal zerstören kann.

    "Ohne GC" gibt es in .Net nicht. Man kann den nicht irgendwie deaktivieren oder umgehen, was man aber kann ist ihn manuell aufzurufen, wobei man das so gut wie nie wirklich brauch.



  • Dein Enthusiasmus in allen Ehren, aber wenn Du ernsthaft vorhast irgendwann mal als Programmierer oder gar Softwareentwickler Deinen Lebensunterhalt zu bestreiten dann mußt Du auch lernen solche Frage SELBSTSTÄNDIG zu recherchieren.

    Am konkreten Beispiel könttest Du z.B. einfach mal in die C# Dokumentation reinschauen:

    Frage 1:

    Google: site:msdn.microsoft.com http://msdn2.microsoft.com/en-us/library/51y09td4(VS.71).aspx
    Dort findest Du dann folgenden Satz:

    Value-type objects such as structs are created on the stack, while reference-type objects such as classes are created on the heap.

    Frage 3:

    Google: site:msdn.microsoft.com http://msdn2.microsoft.com/en-us/library/66x5fx1b(VS.71).aspx

    In general, you should not be as concerned about memory management as you would with C++. This is because the .NET Framework garbage collector implicitly manages the allocation and release of memory for your objects. However, when your application encapsulates unmanaged resources such as windows, files, and network connections, you should use destructors to free those resources. When the object is eligible for destruction, the garbage collector runs the object's Finalize method.



  • Talla schrieb:

    Naja, es ist eine Referenz und kein Zeiger. Es fehlt Zeigerarithmetik und das ganze andere unsichere Zeug.

    Für ein C++ Programmierer ist eine C# Referenz nicht mit einer Referenz unter C++ gänzlich zu vergleichen. Es ist eher eine Art Smartpointer (der aber erst Zeitverzögert mit dem Ableben der letzten Instanz löscht) mit Referenzsyntax. Darauf deutet schon das Referenzen unter C# (sowie Java) null-Werte annehmen können, und man mittels new neue Objekte zuweisen kann.

    Die Referenz unter C++ ist nur ein Aliasname, kann daher weder null-Werte annehmen noch neu zugewiesen werden. Und wegen Unsicherheit: unter C++ hat man dafür die Sicherheit das die Referenz definitiv auf ein Objekt verweist (und nicht null sein kann ;p).

    cu André



  • ja eben wollte das grad sagen, das die c# referenz ehr auf ein c++ zeiger projezierbar ist.

    Naja under C++ hat man mehr Controlle was das ableben von objekten zu tun hat, zudem kann man angeben wo man das objekt haben will heap oder stack, auch oft perfomanter.

    und ich hab auch schon gehört das der CarbageCollector objekt nicht gleich löscht wenn sie nicht mehr verwendet werden, sonder oft zu undefinierten zeitpunkten danach. kann mich aber auch irren...

    @loks : wenn jeder so selbständig wäre wie du, gäbe es keine forums;) :p



  • loks schrieb:

    Dein Enthusiasmus in allen Ehren, aber wenn Du ernsthaft vorhast irgendwann mal als Programmierer oder gar Softwareentwickler Deinen Lebensunterhalt zu bestreiten dann mußt Du auch lernen solche Frage SELBSTSTÄNDIG zu recherchieren.

    Das schlimme ist ja, dass er scheinbar tatsächlich schon als "Softwareentwickler" arbeitet...

    Boris, ein Forum ist ganz sicher nicht dafür da, dir eine Schritt-für-Schritt-Anleitung zu geben wie du ein Problem lösen kannst. Genauso wenig ist es da, dir ständig grundlegende Dinge zu erklären, die man in wirklich jedem Buch/Tutorial finden kann...

    Zum Thema: Ja, es stimmt, es gibt keine fest definierten Zeitpunkte wann der Garbage Collector aufgerufen wird. Dass C++ hier etwas performanter ist mag schon sein, das spielt aber nicht wirklich die Rolle, da du das in "normalen" Anwendungen eh nicht merken wirst. Viel wichtiger ist, dass du die eigentliche Logik sauber und performant programmierst. Da spielt das nicht so die große Rolle.





  • Wie lang arbeitet ihr schon als softwareentwickler?

    Mit c# .NEt arbeite ich seit ner woche , sorry das ich noch nich alle versteh und kann.. und das ich keine zick bücher lese... 👎 🤡



  • nep schrieb:

    Zum Thema: Ja, es stimmt, es gibt keine fest definierten Zeitpunkte wann der Garbage Collector aufgerufen wird. Dass C++ hier etwas performanter ist mag schon sein, das spielt aber nicht wirklich die Rolle, da du das in "normalen" Anwendungen eh nicht merken wirst...

    Das ist übrigens garnicht mal sicher. Je nach Ablauf kann ein GC sogar zu einem (fühlbar?) schnelleren Programm führen.



  • BorisDieKlinge schrieb:

    Wie lang arbeitet ihr schon als softwareentwickler?

    Mit c# .NEt arbeite ich seit ner woche , sorry das ich noch nich alle versteh und kann.. und das ich keine zick bücher lese... 👎 🤡

    Geboren: 1977
    Programmieren angefangen: ca. 1988 (unter Aufsicht xD)
    Proffessionell Programmiert ab: ca. 1999 (kleineres ab 97 oder 98)

    Niemand verlangt von dir alle Bücher zu lesen die es gibt, aber du scheinst schon bei einem Fachbuch zu einem neuen Thema zu verzweifeln. Gut nach dem Studium hat sich mein Fachbuchkonsum auch erstmal für eine Weile auf einen (für mich) niedrigen Mass eingependelt [ca 1 pro 3 Monate], aber seit etwa 3-4 Jahren "vertilge" ich diese eher (Bei mir fallen über 50+ Euro pro Monat für Fachbücher an, und das seit etwa 3-4 Jahren).

    Gut nicht alles davon lese ich komplett (da einige Bücher sich überschneiden) und nicht alles behalte ich auch, dennoch erwarte ich von einem Entwickler das er in der Lage ist sich mit einem neuen Thema innerhalb endlicher Zeit selbstständig anzubilden. Fragen wird jeder noch haben, aber zumindestens 1-2 Fachbücher sollte man schon als Vorarbeit durcharbeiten können.

    cu André



  • im studium wird sowieso wenig praktisch progarmmiert... und dann zum großteil java:(



  • asc schrieb:

    nep schrieb:

    Zum Thema: Ja, es stimmt, es gibt keine fest definierten Zeitpunkte wann der Garbage Collector aufgerufen wird. Dass C++ hier etwas performanter ist mag schon sein, das spielt aber nicht wirklich die Rolle, da du das in "normalen" Anwendungen eh nicht merken wirst...

    Das ist übrigens garnicht mal sicher. Je nach Ablauf kann ein GC sogar zu einem (fühlbar?) schnelleren Programm führen.

    Das schon. Aber das was ich meinte, war auch ein bisschen darauf bezogen, dass man bei C++ ja Objekte auch auf dem Stack anlegen kann, was durchaus von Vorteil ist wenn man viele lokale Objekte hat die man nachher nicht weiter benutzen muss.



  • BorisDieKlinge schrieb:

    im studium wird sowieso wenig praktisch progarmmiert... und dann zum großteil java:(

    Das mag schon sein, aber viele Sachen die du fragst bewegen sich auch auf einer grundlegenderen Ebene.
    Und mal davon abgesehen, wenn du Java programmieren kannst, dann kannst du auch C#/.NET.



  • Ebene ich kenn das CG gedöns von java... wenn ich mich errinere konnte ich da klassen-Objekte aufm stack anlegen!? gut lang her kann mich auch irren..

    hab mich privat aber dann nur mit c/c++ beschäftig... die java geschichten sind schon 4 jahre her;)

    ich weis ich könnte solche fragen auch selber recherchieren, sorry das ich euch damit auf sack gehe.. aber ihr kennt das ja ist oft bequemer hier, und man bekommt "konkrete" anworten.. 😃 😃



  • BorisDieKlinge schrieb:

    im studium wird sowieso wenig praktisch progarmmiert... und dann zum großteil java:(

    Aber im Studium wird gelernt zu lernen...

    Davon abgesehen befinden sich Java und C# auf etwa ein und den selben Level. C# hat nur den Vorteil das es nach Java kam (und man durchaus das ein oder andere abgekupfert hat - man kennt ja schon die Vor- und Nachteile der älteren Sprache). Ganz davon abgesehen ist Java, C# und C++ semantisch sehr ähnlich.

    Ich weiß eh nicht was du gegen Java hast (wie man aus anderen Threads zu genüge lesen kann), den dann müsstest du über C# nicht viel anders denken.

    Sicher, praktische Programmierung ist im Studium die Ausnahme, dennoch sollte man die Mittel in die Hände bekommen haben um sich einzulernen. Wenn ich heutzutage einige Studienabgänger sehe, dann frage ich mich warum die es geschafft und ich es abgebrochen hab (Wobei ich genug aus dem Studium gelernt habe, und das Studium trotz Abbruch auch nicht als verschwendete Zeit ansehe, beileibe nicht).

    Falls du gute Bücher suchst kann ich dir Apress oder Wrox empfehlen. Über 90% aller Bücher die ich von diesen beiden Verlagen kenne sind ihr Geld wert.

    Und verdammt noch mal, nimm dir ein paar Bücher vor.

    cu André



  • ich MUSS C# verwenden wird mir vorrgegben;)



  • Für den Um/Einstieg fand ich z.B. folgendes Buch hilfreich:

    Visual C# 2005 | ISBN 978-3-8273-2324-8

    Es ist nicht sonderlich dick, geht auf die wichtigsten Themen ein und verschafft erst einmal ein Rundumblick.
    Ansonsten gibt es google und eine menge Informationen im Netz.

    So ein wenig Informationsbeschaffung wirst Du im Studium sicherlich gelernt haben.
    (Dazu zählt auch die Wahl des richtigen Forum sowie kein Crossposting).



  • BorisDieKlinge schrieb:

    ich MUSS C# verwenden wird mir vorrgegben;)

    Du solltest dir mal langfristig überlegen ob du nicht mit einer Verbohrtheit und Vorurteilen an Sprachen herangehst, die eher zu Einem passen der schon seine Rente in greifbarer Nähe hat. Du wirst dir eher selbst schädigen wenn du alles als schlechter als Beispielsweise C++ abstempelst, weil Motivation durchaus wichtig ist.

    Ich sage nicht das du alle Sprachen jetzt willkommen heißen musst, aber trenne dich von der Einstellung das nur xyz gut ist (von allen Sprachen die mir bisher untergekommen sind, lehne ich nur eine wirklich ab - wobei ich selbst dieser eine Existenzberechtigung einräume und weiß das diese ihren Sinn und Zweck hat).

    cu André


Log in to reply