Compiler legt mehrere Variablen an die gleiche Speicheradresse

OP #893031
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
Gast #893355
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
Gast #893423
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.
OP #893447
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
}
Gast #893498
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
Gast #893655
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.