| Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme. |
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 ...
![]() |
| | #1 (permalink) |
| Registriert seit: 18.07.05 ![]() Likes: 0 | 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; Code: int i = new int; 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 |
| | |
| | #2 (permalink) |
| Moderator ![]() Registriert seit: 30.09.06 ![]() ![]() ![]() ![]() ![]() ![]() Likes: 441 | 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+ |
| | |
| HaBOT | - Anzeige - |
| |
| | #3 (permalink) |
| Themenstarter Registriert seit: 18.07.05 ![]() Likes: 0 | Ja, aber wo ist denn da der Unterschied? Ich könnte mit Code: class blub{
[...]
}
int main(void){
blub blubbablub;
return 0;
} |
| | |
| | #4 (permalink) | |
| Registriert seit: 14.04.06 ![]() Likes: 4 | Zitat:
Code: int *i = new int; 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. | |
| | |
| | #5 (permalink) |
| Registriert seit: 25.11.05 ![]() Likes: 0 | 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 |
| | |
| | #6 (permalink) |
| Registriert seit: 28.09.07 ![]() Likes: 0 | Es stimmt nicht dass das Ganze nur für Felder oder Klassen benutzt wird, sondern auch für Listen oder ähnlichen logischen "Strukturen". |
| | |
| | #7 (permalink) |
| Senior Member Registriert seit: 03.09.05 ![]() Likes: 0 | 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) |
| | |
| | #8 (permalink) | |
| Moderator ![]() Registriert seit: 17.10.01 ![]() Likes: 0 | Zitat:
![]() 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". | |
| | |
| | #9 (permalink) |
| Registriert seit: 10.02.05 ![]() Likes: 0 | 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. |
| | |
| | #10 (permalink) |
| Guest Likes: | @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 |
|
| | #11 (permalink) |
| Registriert seit: 10.02.05 ![]() Likes: 0 | 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, |
| | |
![]() |
| - Anzeige - | |
| |
| Themen-Optionen | |
| Ansicht | |
| |
Ä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 |