Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

Stack versus Heap

Diskussion: Stack versus Heap im Forum Code Kitchen, in der Kategorie Software Home; Anzeige Hallo! Mich plagt sein längerem schon folgende Frage: Wo ist der Unterschied ob ich eine Variable in C/C++ mit ...

Antwort
Alt 20.10.07, 22:58   #1 (permalink)
 
Registriert seit: 18.07.05
Nimda05 Leistung: Facit NTK
Likes: 0
Standard Stack versus Heap

Anzeige

Hallo!

Mich plagt sein längerem schon folgende Frage:
Wo ist der Unterschied ob ich eine Variable in C/C++ mit

Code:
int i;
oder mit
Code:
int i = new int;
deklariere?

Ersteres ist auf dem Stack und letzteres auf dem Heap. Aber im Endeffekt hab ich das selbe Ergebnis. Was heist das also für mich?
Wann deklariere ich eine Variable auf dem Stack und wann auf dem Heap?

Ich hoffe ihr könnt mir helfen. :)


Nimda05
Nimda05 ist offline   Mit Zitat antworten
Alt 20.10.07, 23:08   #2 (permalink)
Moderator
 
Benutzerbild von bitmuncher
 
Registriert seit: 30.09.06
bitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcore
Likes: 441
Standard

Beim ersteren nutzt du eine "normale" Variable, die eben nur diese einen Wert aufnehmen kann, während du beim zweiteren die Distanz einer Klasse (also ein Objekt) erstellst, das noch eigene Funktionen hat usw.
__________________
Mein Blog - Mein Job - Diaspora

Der Ring uns zu knechten besteht aus 12 Sternen auf blauem Grund.

Neue Beiträge im Habo via Twitter - Das HaBo auf FB - Das HaBo bei G+
bitmuncher ist gerade online   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 20.10.07, 23:12   #3 (permalink)
Themenstarter
 
Registriert seit: 18.07.05
Nimda05 Leistung: Facit NTK
Likes: 0
Standard

Ja, aber wo ist denn da der Unterschied?
Ich könnte mit

Code:
class blub{

[...]
}

int main(void){

  blub blubbablub;
  return 0;
}
doch auch eine Instanz der Klasse erstellen. Ich mein, ich weiss zwar dass man das so nicht macht, aber warum nicht ist die Frage.
Nimda05 ist offline   Mit Zitat antworten
Alt 20.10.07, 23:31   #4 (permalink)
 
Benutzerbild von Eydeet
 
Registriert seit: 14.04.06
Eydeet Leistung: Facit NTK
Likes: 4
Standard

Zitat:
Original von bitmuncher
Beim ersteren nutzt du eine "normale" Variable, die eben nur diese einen Wert aufnehmen kann, während du beim zweiteren die Distanz einer Klasse (also ein Objekt) erstellst, das noch eigene Funktionen hat usw.
Das ist nicht ganz richtig. Erst einmal müsste es so heißen:
Code:
int *i = new int;
Diese Möglichkeit erstellt einen Zeiger auf dem Stack und einen Int auf dem Heap. Der Zeiger verweist dann auf den Heap. Normalerweise benutzt man keine Zeiger für einfache Variablen, da das einfach nur zusätzlich Speicher und Rechenzeit braucht und weiter keinen Nutzen hat.

Interessant werden Zeiger eher für Klassen und Funktionen, da sie an verschiedenen Stellen anstelle des originalen Codes (der originalen Daten) eingesetzt werden können.
Beispielsweise könnte man eine Klasse an eine Funktion übergeben wollen. Wenn man die Variante ohne Zeiger wählt, wird eine Kopie der Klasse erstellt und diese dann an die Funktion übergeben. Die Zeiger-Variante übergibt logischerweise nur einen Zeiger.

Fazit: Zeiger nur für Datenstrukturen wie structs, classes und arrays verwenden, wenn diese an Funktionen übergeben werden sollen, alles andere ist sinnlos und macht den Code nur komplizierter. Pointer-Arithmetik ist eine Wissenschaft (und Fehlerklasse) für sich, und eins der Dinge, für die C(++) bei manchen verflucht und bei manchen geliebt wird.
Eydeet ist offline   Mit Zitat antworten
Alt 20.10.07, 23:35   #5 (permalink)
 
Registriert seit: 25.11.05
menace Leistung: Facit NTK
Likes: 0
Standard

grössere Datenstrukturen werde in der imperativen (also prozedural wie auch objektorientiert) Programmierung auf dem Heap erzeugt. In Aller Regel! Der punkt ist halt, dass du auf den Stack eine Variable legst, die bloss einen Pointer hat auf die datenstruktur im heap beim 2. beispiel, beim ersten beispiel hat die variable auf dem stack genau halt den inhalt, den du reinschreibst.

Dynamische Datenstrukturen erzeugt man in C/C++ auf dem Stack nur mit alloca, wobei ich jetzt gerade nicht weiß, wie verbreitet das ist, ich glaub aber eher nicht
menace ist offline   Mit Zitat antworten
Alt 23.10.07, 17:12   #6 (permalink)
 
Registriert seit: 28.09.07
Kenniej91 Leistung: Facit NTK
Likes: 0
Standard

Es stimmt nicht dass das Ganze nur für Felder oder Klassen benutzt wird, sondern auch für Listen oder ähnlichen logischen "Strukturen".
Kenniej91 ist offline   Mit Zitat antworten
Alt 23.10.07, 18:05   #7 (permalink)
Senior Member
 
Registriert seit: 03.09.05
Lesco Leistung: Facit NTK
Likes: 0
Standard

Ich würde aber empfehlen, wenn man Objekte/structs oder ähnliches in C++ an Funktionen übergibt, dann sollte man nicht Zeiger, sondern Referenzen verwenden. Das ist bequemer und weniger fehleranfällig und von der Performance/dem Rechenaufwand identisch mit der Zeiger-Variante.(erzeugt letztendlich den selben Maschinencode)
Lesco ist offline   Mit Zitat antworten
Alt 24.10.07, 19:25   #8 (permalink)
Moderator
 
Registriert seit: 17.10.01
soox Leistung: Facit NTK
Likes: 0
Standard

Zitat:
Original von Lesco
Ich würde aber empfehlen, wenn man Objekte/structs oder ähnliches in C++ an Funktionen übergibt, dann sollte man nicht Zeiger, sondern Referenzen verwenden. Das ist bequemer und weniger fehleranfällig und von der Performance/dem Rechenaufwand identisch mit der Zeiger-Variante.(erzeugt letztendlich den selben Maschinencode)
Bei Referenzen musst du jedoch aufpassen, dass diese noch auf dem Stack vorhanden ist
Mit anderen worten, eine Init Funktion welche eine Liste (mit Referenzen) abfüllt, wird nach der Init Funktion nur noch Müll beinhalten. Ein Zugriff auf diese ergibt ein "Segmentation Fault".
soox ist offline   Mit Zitat antworten
Alt 24.10.07, 22:36   #9 (permalink)
 
Registriert seit: 10.02.05
ToxicJetzt! Leistung: Facit NTK
Likes: 0
Standard

Referenz sollte man nur verwenden, wenn das übergebene Objekt in der Funktion nicht verändert, weil der Anwender nicht direkt merkt, dass es ne Referenz ist. Am besten im Prototyp direkt konstant deklarieren.
ToxicJetzt! ist offline   Mit Zitat antworten
Alt 24.10.07, 23:08   #10 (permalink)
sw33tlull4by
Guest
 
Likes:
Standard

@above
Wieso das denn kann man nicht einfach folgendes machen

object& meineFunktion(object &tata)
{
//veraenderung des Objeltes
return tata;
}

dann muesste man sich nicht mit dem -> Operator auseinandersetzen und der Codewuerde im vergleich zu normalen Instanzen einheitlicher und leichter zu lesen.
mfg

sw33t
  Mit Zitat antworten
Alt 25.10.07, 15:29   #11 (permalink)
 
Registriert seit: 10.02.05
ToxicJetzt! Leistung: Facit NTK
Likes: 0
Standard

In dem Fall würde ich z.B einen Zeiger benutzen. Immer noch den Fall gesetzt, dass der User denkt der macht CallByValue könnte er ja denken die Variable, die er übergeben hat bleibt unverändert und rechnet nach dem Aufruf der Funktion damit weiter in dem Glauben es ist immer noch der alte Wert. Aber da hat sicher jeder seine eigenen Vorlieben,
ToxicJetzt! ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Stack versus Heap
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
PS3 versus XBOX360 naked_chef Fun Section 3 12.03.08 19:15
Stack Overflow harissa Hacks & Crackmes 0 12.11.07 18:35
Stack - Programmierung Outbraker Code Kitchen 3 17.11.06 13:52
Deutsche Justiz versus FileSharing Rushjo News & Ankündigungen 19 01.09.03 17:57
Aliens versus Predator 2 Avenging-Angel Games 4 27.12.01 11:27


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61