Forum: PC-Programmierung Compiler legt mehrere Variablen an die gleiche Speicheradresse


von Karlheinz D. (kdruschel)


Lesenswert?

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

von Jörg (Gast)


Lesenswert?

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

von der mechatroniker (Gast)


Lesenswert?

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.

von Karlheinz D. (kdruschel)


Lesenswert?

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
}

von Jörg (Gast)


Lesenswert?

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

von Rolf Magnus (Gast)


Lesenswert?

>     string2 = "Test";      // Nun steht überall "Test" drin

Woher weißt du das?

von Karlheinz D. (kdruschel)


Lesenswert?

Jörg:

Nein, beide Strings werden innerhalb der Funktion weiterhin verwendet 
(bzw. alle drei).

Rolf:
Das sieht man im Debugger :-)

von yalu (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.