Hi Leuts, ich habe hier schon seit einigen Jahren mit Visual Studio DotNet2003 und habe ein Problem, dass mich vor ein Rätsel stellt. Ich habe eine Klasse xyz mit drei Membervariablen CString string1; CString string2; CString string3; Nun stelle ich beim Debuggen fest, dass string1, string2 und string3 auf der gleichen Adresse im Heap liegen! Logischerweise haben auch immer alle drei Variablen den gleichen Inhalt, egal werlcher der drei ich etwas zuweise. Hat jemand für sowas eine Erklärung ? Greets Karlheinz
Das mit den gleichen Adressen kann schon sein! Du definierst zwar alle Variablen hintereinander, benutzt dann aber vieleicht die Variablen in vollständig unabhängigen Bereichen im Code. Der Compiler kann das dann feststellen und speicheroptimierend nur eine Speicherstelle vergeben. (gemeint ist natürlich der Heap-Speicher). Hast Du aber Code wie string1 = "Hallo"; string2 = "Welt"; string3 = string1 + " " + string2; dann werden wohl drei Adressen generiert. Gruss Jörg
AFAIK werden auch erst dann verschiedene Speicherbereiche verwendet, wenn zwei Strings das erste Mal zwei unterschiedliche (und beide nicht-leere) Inhalte bekommen. So ists zumindest bei Java, ich denk mal .net machts genauso.
Nein, daran liegts definitiv nicht. Mehr Info: class Cxyz { private: CString string1; CString string2; CString string3; public: void Func1(void); } Cxyz::Func1 (void) { string1 = "Hallo"; // Ab diesem Moment steht "Hallo" in string1, // string2 und string3; string2 = "Test"; // Nun steht überall "Test" drin }
Genau hier hast Du aber die von mir beschriebene Situation: zuerst wird "string1" beschrieben und dann erst "string2". "string1" wird dann aber nicht mehr verwendet (wird wohlmöglich bei der Release-Version komplett entfernt. Der Compiler sieht dann wahrscheinlich die Möglichkeit zur Optimierung. Neu ist mir aber (bzw. mir ist's bis jetzt nicht aufgefallen), dass der Compiler auch Klassen-Variablen bzgl. Speicherplatz optimiert. Gut zu wissen, dass man sich darum nicht kümmern muss. Verlassen sollte man sich darauf aber auch nicht. Gruss Jörg
> string2 = "Test"; // Nun steht überall "Test" drin
Woher weißt du das?
Jörg: Nein, beide Strings werden innerhalb der Funktion weiterhin verwendet (bzw. alle drei). Rolf: Das sieht man im Debugger :-)
Ist das C++?
Wenn nein: Mit diesem C#- und Managed-C++-Zeugs kenne ich mich
nicht aus, da kann dieses Verhalten durchaus ein Feature sein ;-)
Wenn ja: Ich kann mir auch nicht vorstellen, dass der Compiler einfach
eine Member-Variable wegoptimiert. Das kann er ja nur, wenn er sehen
kann, dass in keiner der Member-Funktionen die Variable in
sinnvoller Weise benutzt wird. Was macht er aber, wenn er in einer
bestimmten Kompilationseinheit nur die Klassendeklaration, nicht aber
die Definitionen der Member-Funktionen zu sehen bekommt?
> Das sieht man im Debugger :-)
Trau niemals einem Debugger! Was passiert, wenn du am Ende von
Cxyz::Func1 string1 und string2 durch das Programm auf dem Bildschirm
ausgeben lässt (mit cout oder wie auch immer)? Was wird dann auf dem
Bildschirm ausgegeben, und was sagt dann der Debugger?
Der Compiler darf alles Mögliche mit deinem Code anstellen, wenn
hinterher nur das ausgegebene Ergebnis stimmt.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.