C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Speicherverwaltung, Heap und Stack

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
uma
Guest





PostPosted: Mon Apr 05, 2004 12:11 pm    Post subject: Speicherverwaltung, Heap und Stack Reply with quote



Hi,
ich habe eine Frage zur Speicherverwaltung in einem c++ Programm:

class TObjectB {
...
TObjectA member;
void set(TObjectA &aObject) {
member = aObject;
}
}
....
TObjectB b = new TObjectB();
....
void myFunc() {
TObjectA a = TObjectA(); // a wird auf dem stack erzeugt
b->set(a); // Kopie(?) von a wird an b übergeben (Stack/Heap?)
}
....
delete b;

Im obigen Quellcodeschnipsel existiert ein Objekt b, welches ein
Objekt vom Typ TObjectA als Variable besitzt.
Die Funktion myFunc() wird mehrmals im Programm aufgerufen und erzeugt
eine Instanz von TObjectA, welche an b übergeben wird.

Was passiert da nun eigentlich? (Bitte korrigiert mich, wenn ich
irgendwo falsch liege.)
-Für myFunc() wird auf dem Stack Speicher für ein Object vom Typ
TObjectA allokiert.
-In der Zeile b->set(a) wird von a eine Kopie erzeugt (wo
(Heap/Stack)) und an b übergeben.
-b übernimmt dann a als Variable "member"
-Beim Verlassen von myFunc() wird der für a genutzte Speicher
automatisch wieder frei gegeben.

Was geschieht jedoch, wenn "member" vorher mit einem Objekt belegt war
(durch einen früheren Aufruf von myFunc())? Wird der Speicher
automatisch wieder frei gegeben?

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Frank Fischer
Guest





PostPosted: Mon Apr 05, 2004 3:00 pm    Post subject: Re: Speicherverwaltung, Heap und Stack Reply with quote



On 2004-04-05, uma <umauma (AT) gmx (DOT) de> wrote:
Quote:
Was passiert da nun eigentlich? (Bitte korrigiert mich, wenn ich
irgendwo falsch liege.)
-Für myFunc() wird auf dem Stack Speicher für ein Object vom Typ
TObjectA allokiert.
stimmt


Quote:
-In der Zeile b->set(a) wird von a eine Kopie erzeugt (wo
(Heap/Stack)) und an b übergeben.
stimmt nicht. Das Objekt wird nämlich per Referenz übergeben, also seine

Adresse. Die "Kopie" wird erst in der Funktion set beim Zuweisen
erzeugt. Genauer wird der Kopiekonstruktor von "member" aufgerufen, d.h.
member wird nicht gelöscht, sondern aktualisiert seine Daten mit dem
übergebenen Objekt.

Quote:
-Beim Verlassen von myFunc() wird der für a genutzte Speicher
automatisch wieder frei gegeben.

Was geschieht jedoch, wenn "member" vorher mit einem Objekt belegt war
(durch einen früheren Aufruf von myFunc())? Wird der Speicher
siehe oben. Für explizit von member angeforderten Speicher (in dessen

Konstruktor z.B.) und dessen Freigabe ist der Kopiekonstruktor
zuständig. Der Speicher für member selbst wird aber weiterverwendet
(überschrieben).

Frank

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Rolf Magnus
Guest





PostPosted: Mon Apr 05, 2004 3:30 pm    Post subject: Re: Speicherverwaltung, Heap und Stack Reply with quote



uma wrote:

Quote:
Hi,
ich habe eine Frage zur Speicherverwaltung in einem c++ Programm:

class TObjectB {
...
TObjectA member;
void set(TObjectA &aObject) {
member = aObject;
}
}
...
TObjectB b = new TObjectB();
...
void myFunc() {
TObjectA a = TObjectA(); // a wird auf dem stack erzeugt
b->set(a); // Kopie(?) von a wird an b übergeben (Stack/Heap?)
}
...
delete b;

Im obigen Quellcodeschnipsel existiert ein Objekt b, welches ein
Objekt vom Typ TObjectA als Variable besitzt.
Die Funktion myFunc() wird mehrmals im Programm aufgerufen und erzeugt
eine Instanz von TObjectA, welche an b übergeben wird.

Was passiert da nun eigentlich? (Bitte korrigiert mich, wenn ich
irgendwo falsch liege.)
-Für myFunc() wird auf dem Stack Speicher für ein Object vom Typ
TObjectA allokiert.

Je nach Compiler ein- oder zweimal.

TObjectA a = TObjectA();

erzeugt erst per Default-Konstruktor ein namenloses temporäres Objekt
vom Typ TObjectA (rechte Seite) und dann per Kopierkonstruktor daraus
die Variable a vom selben Typ (linke Seite). Moderne Compiler fassen
das allerdings zusammen und erzeugen direkt die Variable a per
Default-Konstruktor. Sie haben von der C++-Norm auch offiziell die
Erlaubnis, das Kopieren wegzulassen.

Quote:
-In der Zeile b->set(a) wird von a eine Kopie erzeugt (wo
(Heap/Stack)) und an b übergeben.

a wird per Referenz übergeben. Das heißt, daß keine Kopie übergeben
wird.

Quote:
-b übernimmt dann a als Variable "member"

Stimmt auch nicht. Die Memberfunktion set() weist a der Membervarable
member zu. Dabei wird die schon existierende Membervariable per
(kopier-) Zuweisungsoperator zur Kopie von a gemacht.

Quote:
-Beim Verlassen von myFunc() wird der für a genutzte Speicher
automatisch wieder frei gegeben.

Korrekt.

Quote:
Was geschieht jedoch, wenn "member" vorher mit einem Objekt belegt war
(durch einen früheren Aufruf von myFunc())?

member ist _immer_ schon mit einem Objekt belegt. Dieses wird bei der
Konstruktion von b erzeugt. member selbst ist das Objekt.

Quote:
Wird der Speicher automatisch wieder frei gegeben?

Nein, aber da ja eine Zuweisung stattfindet, braucht er das auch nicht.
Das darin befindliche Objekt wird dabei einfach passend verändert.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Frank Fischer
Guest





PostPosted: Mon Apr 05, 2004 6:18 pm    Post subject: Re: Speicherverwaltung, Heap und Stack Reply with quote

On 2004-04-05, Frank Fischer <frank.fischer (AT) s2001 (DOT) tu-chemnitz.de> wrote:
Kopiekonstruktor ist natürlich Blödsinn, ich meine den
Zuweisungsoperator.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
uma
Guest





PostPosted: Mon Apr 05, 2004 8:19 pm    Post subject: Re: Speicherverwaltung, Heap und Stack Reply with quote

Danke für die Antwort. Nun ist es klar.
Noch eine Frage zum Heap/Stack:

Was landet wo? Sind im Heap nur die Daten untergebracht, welche zu
Programmstart bereits feststehen? Also alles, was ohne "new" oder
"alloc" erzeugt wird?
Liegt der Rest komplett auf dem Stack?

Zur Speicheraufteilung von Programmen wird immer nur vom Code-,Heap-
und Stacksegment geredet. Also nehme ich mal an, daß die Daten
entweder im Heap oder im Stack landen müssen. Oder gibt es noch einen
dritten Datenspeicher?

Einfaches Bsp.: Irgendwann zur Laufzeit wird eine 20MB Datei komplett
eingelesen. Wo landen die Daten?

Hintergrund:
Ich habe gelesen, daß die Allokierung von Speicher auf dem Stack bzw.
Heap unterschiedlich viel Rechenzeit erfordert. Da mich bisher
herzlich wenig interessiert hat, wo konkret meine Daten im Speicher
landen, würde ich nun aber mal mehr darüber erfahren. Jedoch bin ich
über google und meine vorhandenen Fachbücher nicht schlauer geworden,
da das Thema immer nur sehr kurz abgehandelt wird (Die 3 Segmente
werden kurz erwähnt und Ende).

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Rolf Magnus
Guest





PostPosted: Mon Apr 05, 2004 9:36 pm    Post subject: Re: Speicherverwaltung, Heap und Stack Reply with quote

uma wrote:

Quote:
Danke für die Antwort. Nun ist es klar.
Noch eine Frage zum Heap/Stack:

Was landet wo? Sind im Heap nur die Daten untergebracht, welche zu
Programmstart bereits feststehen? Also alles, was ohne "new" oder
"alloc" erzeugt wird?
Liegt der Rest komplett auf dem Stack?

Nun, zunächst mal kennt C++ zwar sowohl Heap als auch Stack, aber beide
haben dort eine ganz andere Bedeutung. C++ schreibt nicht vor, daß
lokale Variablen in einem Stack gespeichert werden. Die Norm spricht
hier von "autmoatic storage", da die Variable beim Beenden des Blocks
automatisch zerstört wird.
Den Speicher, der von new oder malloc kommt, wird "free store" genannt.
Bei ihm handelt es sich um das, was du Heap nennst.

Quote:
Zur Speicheraufteilung von Programmen wird immer nur vom Code-,Heap-
und Stacksegment geredet. Also nehme ich mal an, daß die Daten
entweder im Heap oder im Stack landen müssen. Oder gibt es noch einen
dritten Datenspeicher?

Wenn wir uns mal von dem, was C++ definiert, entfernen (und damit
plattformabhängig werden), gibt's oft noch das Datensegment. Dort
landen die Variablen, die während der ganzen Programmlaufzeit
existieren. Heap wäre new und Konsorten, Stack für die
"automatic"-Geschichte. Das dürfte eine häufig anzutreffende
Konstellation sein.

Quote:
Einfaches Bsp.: Irgendwann zur Laufzeit wird eine 20MB Datei komplett
eingelesen. Wo landen die Daten?

Kommt drauf an. Das liegt in deiner Hand. Wenn du new benutzt (was wohl
am besten ist), landet es auf dem "free store".

Quote:
Hintergrund:
Ich habe gelesen, daß die Allokierung von Speicher auf dem Stack bzw.
Heap unterschiedlich viel Rechenzeit erfordert.

new/malloc ist in der Regel langsamer, da erst nach einem passenden
freien Speicherblock gesucht werden muß und ggf. per Systemaufruf von
der Speicherveraltung des Betriebssystems neuer Speicher angefordert
werden muß. Dafür lebt das Objekt auch über Funktionsgrenzen hinweg und
muß nicht extra kopiert werden, falls man es aus einer Funktion
rausgeben will. Was letztendlich mehr Rechenzeit verbraucht, hängt
wieder vom Einzelfall und natürlich auch von der Implementation (also
Compiler und verwendete Standardbibliothek) ab. In vielen Fällen spielt
der Unterschied auch kaum eine Rolle.
Bei dem Stack ist noch zu erwähnen, daß dieser oft eine feste Größe hat.
Daher würde ich z.B. beim Einlesen einer 20MB-Datei in selbigen einen
Stack-Overflow erwarten.

Quote:
Da mich bisher herzlich wenig interessiert hat, wo konkret meine Daten
im Speicher landen, würde ich nun aber mal mehr darüber erfahren.
Jedoch bin ich über google und meine vorhandenen Fachbücher nicht
schlauer geworden, da das Thema immer nur sehr kurz abgehandelt wird
(Die 3 Segmente werden kurz erwähnt und Ende).

Da C++ nicht vorschreibt, wie und wo die Daten gespeichert werden, würde
ich von einem C++-Buch auch nicht erwarten, daß es sich darüber
ausführlich auslässt.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.