Hallo Zusammen, ich habe eine Frage zum Thema Stack/Heap.
Beispiel Zeiger:
1
inti=0;
2
int*pZeiger=NULL;
3
pZeiger=&i;
Wird die Variable i auf dem Stack oder auf dem Heap deklariert und
definiert? Unabhängig davon, was danach folgt. Ich gehe davon aus, dass
es auf dem Stack geschieht, da Parameterübergaben von Funktionen auch
über den Stack laufen.
Was passiert dann? Wird pZeiger dann auf dem Heap angelegt? Oder bezieht
sich das Thema Stack lediglich auf Parameterlisten von Funktionen, wo
lokale Kopien erzeugt werden?
Wie sieht es in diesem Beispiel aus:
1
int*pZeiger=NULL;
2
y=newint;
3
*pZeiger=55;
4
cout<<"pZeiger: "<<*pZeiger;
Hier läuft alles über den Heap, wobei im Vergleich zum ersten genannten
Beispiel die Deklaration und Definition einer lokalen Variable entfällt,
oder?
Michi schrieb:> Wird die Variable i auf dem Stack oder auf dem Heap deklariert und> definiert?
Auf dem Stack.
> Was passiert dann? Wird pZeiger dann auf dem Heap angelegt?
Bei einem vernünftigen Compiler bleibt der in einem Register, also
nichtmal Stack. „i“ muss ja nur deshalb im Speicher landen, weil
du danach explizit eine Adresse davon nimmst und damit weiterarbeitest.
> Wie sieht es in diesem Beispiel aus:>
1
>int*pZeiger=NULL;
2
>y=newint;
3
>*pZeiger=55;
4
>cout<<"pZeiger: "<<*pZeiger;
5
>
>> Hier läuft alles über den Heap,
Heap wäre nur für „y” ein Thema, aber das benutzt du danach nicht.
Allerdings ist sehr wahrscheinlich irgendeine Art von Trap oder
Exception des Prozessors im Spiel, es sei denn, 55 wäre in der Tat
eine gültige Adresse in deiner Architektur, von der man einen „int“
lesen kann.
Johann L. schrieb:> Speicherklasse von i ist Static Storage.
Je nachdem, an welcher Stelle dieses Codeschnipsel steht: ich war in
meiner Antwort davon ausgegangen, dass es innerhalb einer Funktion
ist.
> Wird die Variable i auf dem Stack oder auf dem Heap
Das kommt drauf an, ob sich dein Code-Fragment innerhalb einer Funktion
oder außerhalb befindet.
Innerhalb einer Funktion belegen Variablen normalerweise Platz auf dem
Stack. Globale Variablen, die außerhalb jeder Funktion im Quelltext
stehen, belegen Platz außerhalb des Stack im "Data" Segment.
Der Heap ist wiederum ein dritter Speicherbereich, der durch new,
malloc() und calloc() belegt werden kann.
1
#include<stdint.h>
2
3
inta=1;
4
5
voiddoSomething()
6
{
7
intb=2;
8
staticintd=4;
9
}
10
11
intmain()
12
{
13
int*c=malloc(2);// belege 2 Bytes
14
*c=4;
15
}
a liegt im Data Segment.
b liegt auf dem Stack, während die Funktion doSomething() läuft.
c ist ein Zeiger der sich auf dem Stack befindet. C zeigt auf einen
Speicherbereich von 2 Bytes Größe, der im Heap befindet.
d liegt im Data Segment.
Siehe auch http://www.nongnu.org/avr-libc/user-manual/malloc.html, da
ist die Speicheraufteilung für AVR dargestellt.
Beim avr Compiler gibt es noch das bss Segment, dort werden statische
Variablen (in diesem Fall a und d) abgelegt, wenn sie keine
Initialisier-Wert haben. Ich glaube, der Startwert 0 wird auch als
"keine Initialisierung" gewertet.
Stefan U. schrieb:> Beim avr Compiler gibt es noch das bss Segment
Nicht nur bei dem. Das Einsammeln nicht explizit initialisierter
globaler oder statischer Variablen in einem eigenen Segment ist
eine durchaus übliche Strategie. Wenn du mal im Netz nachliest,
wofür BSS steht, wirst du feststellen, dass man das schon vor einem
halben Jahrhundert so gemacht hat. ;-)
Stefan U. schrieb:>> Wird die Variable i auf dem Stack oder auf dem Heap>> Das kommt drauf an, ob sich dein Code-Fragment innerhalb einer Funktion> oder außerhalb befindet.
Ich seh da keine Funktion. Weder in Prosa noch in Code.
Und "Stack" gibt's im C++ Standard auch keinen, das sind alles Details
der C++ Implementation, vulgo Compiler.
Und bei fast allen realen Implementations gibt's auch den
Speicherbereich Nirwana (wegoptimiert).
> Ich seh da keine Funktion. Weder in Prosa noch in Code.
doSomething() und main() sind Funktionen. Auf diese habe ich mich klar
und deutlich bezogen.
> Und "Stack" gibt's im C++ Standard auch keinen
Das mag ja sein, doch erstens hat niemand gesagt, daß es um C++ geht
(die Syntax passt ebenso zu C) und zweitens haben wir alle verstanden,
wie der TO die Frage gemeint hat. Nur Du stellst dich gerade absichtlich
doof, zu welchem Zweck eigentlich?
> Und bei fast allen realen Implementations gibt's auch den> Speicherbereich Nirwana (wegoptimiert).
Es gibt definitv auf keinem Computer und in keiner Programmiersprache
einen Speicherbereich, der Nirvana heißt oder so ähnlich heißt oder
einen solchen Zweck erfüllt. Es hätte auch keinen Sinn, denn was weg
optimiert ist, existiert nicht.
In Systemen mit Garbage Collector gibt es wiederum ganz andere
Speicherbereiche - kannst ja mal darüber sinnieren, anstatt diesen
Thread hier zu stören.
Jörg W. schrieb:> Johann L. schrieb:>> Speicherklasse von i ist Static Storage.>> Je nachdem, an welcher Stelle dieses Codeschnipsel steht: ich war in> meiner Antwort davon ausgegangen, dass es innerhalb einer Funktion> ist.
Wo sonst? Zuweisungen außerhalb von Funktionen sind nicht erlaubt.
Stefan U. schrieb:>> Und "Stack" gibt's im C++ Standard auch keinen>> Das mag ja sein, doch erstens hat niemand gesagt, daß es um C++ geht> (die Syntax passt ebenso zu C)
Das gilt für C genauso.
> und zweitens haben wir alle verstanden, wie der TO die Frage gemeint hat.> Nur Du stellst dich gerade absichtlich doof, zu welchem Zweck eigentlich?
Er stellt sich nicht doof, sondern erklärt, wie es in C++ eigentlich
definiert ist. Stack, Heap u.s.w sind Implementationdetails und auf
Ebene der Sprache nicht relevant. Das auch so zu erklären, halte ich für
die richtige Antwort auf die Frage. Es hätte freilich etwas
ausführlicher und freundlicher geschrieben sein können.
>> Und bei fast allen realen Implementations gibt's auch den>> Speicherbereich Nirwana (wegoptimiert).>> Es gibt definitv auf keinem Computer und in keiner Programmiersprache> einen Speicherbereich, der Nirvana heißt oder so ähnlich heißt oder> einen solchen Zweck erfüllt. Es hätte auch keinen Sinn, denn was weg> optimiert ist, existiert nicht.
Ach, oben mahnst du an, dass es auch bei nicht ganz korrekter Nutzung
der Begriffe reicht, wenn man weiß, was gemeint ist, und hier wirst du
dann auf einmal kleinlich? Passt nicht ganz zusammen.