www.mikrocontroller.net

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


Autor: Karlheinz Druschel (kdruschel)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karlheinz Druschel (kdruschel)
Datum:

Bewertung
0 lesenswert
nicht 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
}

Autor: Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>     string2 = "Test";      // Nun steht überall "Test" drin

Woher weißt du das?

Autor: Karlheinz Druschel (kdruschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg:

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

Rolf:
Das sieht man im Debugger :-)

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.