Instanzen erzeugen
-
Hallo,
mir ist gerade etwas aufgefallen.
in allen büchern, tutorials oder what ever, in denen es um klassen ging erzeugt man Instanzen immer auf folgende art und weise.
Cxyz ABC;(sollte richtig sein, bin gerade etwas irritiert :))
so, nun da ich vor einiger zeit etwas mit c# gewerkelt habe muss ich mir wohl folgendes angewöhnt haben.
Cxyz *ABC = new Cxyz();Das gab bisher auch keine Fehlermeldungen, und ich habe mich eigentlich schon die ganze zeit gewundert, warum ich immer ein * davor setzen muss, was ich vorher ja eigentlich nie musst

nunja, das ganze hat bisher auch funktioniert, nur möchte ich jetzt wissen, was das für komisches gebilde ist. ok, ein Zeiger, aber auf was? auf eine neue Cxyz Instanz? oder liege ich komplett falsch?mfg
EDIT:
dazu kommt dann noch der Operator "->" anstatt "." für klassenfunktionen. auch da habe ich mich gewundert, bisher aber nich drum gekümmert^^
-
Moin,
Cxyz ABC;Erzeugung auf dem Stack; wird zerstört, wenn Gültigkeitsbereich (z. B. Funktion) verlassen wird
Cxyz *ABC = new Cxyz();Erzeugung auf dem Heap und Pointer auf den Speicherbereich; muss vom Programmierer freigegeben werden.
Das ist jetzt keine vollständige Erklärung, aber vielleicht reicht das ja schon.

MfG
-
ok,
klingt plausiebel.
nur wo bietet es sich an welche der beiden methoden zu benutzen?
hmm.. kurze recherche erbracht folgendes (ich muss gestehen, ich bin absolut kein profi was speicherverwaltung angeht .)
stack ist schnell, dafür aber stark begrenzt (wie begrenzt weiß ich nich, kann das vll jemand mal spezifizieren?)
heap ist langsamer, dafür aber praktisch so groß wie der arbeitspeicher selbst (habe ich das so richtig verstande?)
also wäre es praktisch ratsamer riesige struckt und klassen in den heap auszulagern? und was ist, wenn der stack voll ist? landet dann alles im heap, oder einfach im nirvana (was ja beides nich unbedingt toll wäre).
mfg
-
anti-freak schrieb:
stack ist schnell, dafür aber stark begrenzt (wie begrenzt weiß ich nich, kann das vll jemand mal spezifizieren?)
Das reservieren des Speichers auf dem Stack ist schnell - denn der Stack ist bereits zu Programmstart reserviert. Normalerweise ist der Stack so 1-2 MB groß, was aber mit zusätzlichen Compiler-Optionen vergrößert werden kann (in der Regel nicht notwendig).
anti-freak schrieb:
heap ist langsamer, dafür aber praktisch so groß wie der arbeitspeicher selbst (habe ich das so richtig verstande?)
Speicher auf dem Heap muss reserviert werden. Dies geschieht mittels des Keywords new. In dem Fall fragt das Programm quasi das Betriebssystem, ob es den gewünschten Speicher bereitstellen kann. Dies dauert eben seine Zeit.
Die Zugriffszeiten auf Stack und Heap sind jedoch identisch.
anti-freak schrieb:
also wäre es praktisch ratsamer riesige struckt und klassen in den heap auszulagern? und was ist, wenn der stack voll ist? landet dann alles im heap, oder einfach im nirvana (was ja beides nich unbedingt toll wäre).
Ja, große Datenmengen sollten auf dem Heap erstellt werden. Wenn der Stack voll ist, dann gibt es einen Stack Overflow und dein Programm stürzt ab.
Aber Bedenke: Sämtlichen auf dem Heap reservierten Speicher musst du mittels delete auch wieder freigeben! Sonst hast du Speicherlecks, was ganz ganz böse ist.
-
new musst du immer dann verwenden, wenn die Instanzen den aktuellen Scope überleben müssen.
Bei vielen Objekten ist es in Ordnung und wünschenswert, dass sie am Ende des Scopes automatisch wieder zerstört werden. Für alles andere gibt es new.
-
Bei deiner Recherche hast du anscheinend nur die unwichtigen Punkte gefunden. Die Entscheidung Stack/Heap sollte nicht von irgendwelchen Geschwindigkeitsüberlegungen abhängen sondern von den unterschiedlichen Eigenschaften der Speicherverwaltung auf Stack/Heap:
Den Heap benutzt dann, wenn:
1. Du während des Programmierens nicht weißt, wie groß eine Variable sein wird, z.B. bei Feldern unbekannter Größe oder bei polymorphen Objekten unbekannten Typs.
2. Du sehr große Objekte (> 1MB) hast.
3. Man eine genauere Kontrolle über die Lebenszeit eines Objekts benötigt als der Stack es bietet
4. Ein Objekt den aktuellen Scope überleben soll, aber nicht kopiert werden kann/soll (dies geht aus 3. hervor, wollte es nur nochmal explizit aufschreiben)
5. Auf ein Objekt von mehreren Stellen aus zugegriffen werden soll (dies geht aus 4. hervor, wollte es nur nochmal explizit aufschreiben)Den Stack benutzt du:
- Immer sonst. Und dies ist der Regelfall.Denke auch daran, dass die Standardbibliothek bereits viele fertige Klassen zur Benutzung des Heaps anbietet. Es besteht nur äußerst selten ein Grund, selber zu new/delete (und der damit einhergehenden Verantwortung) greifen zu müssen.
-
Vielen Dank an euch^^
Das hat mir schon recht gut weiter geholfen
Fragen wären somit beantwortet.mfg