www.mikrocontroller.net

Forum: PC-Programmierung mehr oder weniger Variablen


Autor: T_S (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich stelle mir gerade die Frage, was für den Speicherverbrauch 
besser wäre:

Beispiel 1:
int a = 1;
int b = 2;
int c = 3;
int d = 4;

int e1, e2, e3, e4, f;

e1 = (a + b) * c - d;
e2 = a * b + c - d;
e3 = (a + b + c) * d;
e4 = a + b + c + d;

f = e1 * (e2 + e3) - e3;

oder

Beispiel 2:
int a = 1;
int b = 2;
int c = 3;
int d = 4;

int f;

f = ((a + b) * c - d) + ((a * b + c - d) + ((a + b + c) * d)) - (a + b + c + d);

Beispiel 1 ist von der Lesbarkeit her natürlich besser, Beispiel 2 würde 
4 Variablen einsparen. Gehen wir nun mal davon aus, das in einem 
Programm viele solcher Rechnungen vorkommen mit eventuell größeren 
Datentypen.

Was meint ihr dazu?

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau dir das Assemblerresultat an. Beim idealen Compiler kommt jedesmal 
das Gleiche raus - beim reelen ist das schwer vorauszusagen ;-)

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mach mal doch ein Experiment!
compiliere es und schaue dir welche exe grösser wird.
wenn du dem Effekt auf den Grund gehst, wirst du eine Menge
begreifen.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst es ja mal so schreiben:
f = c*a + c*b - 3*d + a*b + d*a + d*b + d*c - a - b

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Stegemann wrote:
> Schau dir das Assemblerresultat an. Beim idealen Compiler kommt jedesmal
> das Gleiche raus - beim reelen ist das schwer vorauszusagen ;-)
Der ideale Compiler wird diesen konstanten Ausdruck vollständig durch 
das Resultat der Rechnung ersetzen ;)

Ansonsten spart man durch weniger Variablen nichts.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Speicherverbrauch ist hier recht uninteressant, da waere es 
hoechstens die Laufzeit, also die Anzahl der Operationen. Ich bin jetzt 
nicht davon ausgegangen dass der Ausdruck immer konstant ist, sondern 
dass das jetzt nur Beispielzahlen sind. Sonst kann man ja im Programm 
gleich den konstanten Ausdruck hernehmen oder ein Makro dafuer benutzen.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Generell darfst du davon ausgehen, das ein Compiler vom Optimierungsgrad 
eines GCC sich von Zwischenvariablen nicht irritieren lässt und mit oder 
ohne diese den gleichen Code erzeugt.

Allerdings nur, wenn sich das Ergebnis dadurch nicht ändert. Was der 
Fall sein kann, wenn die Variablen kleiner sind als die normgerecht 
durchgeführte Rechnung. Also beispielsweise bei Variablen kleiner als 
"int". Denn
char i;
char k = i + 1;
if (k < 100)
ist nicht identisch mit
if (i+1 < 100)
sondern entspricht
if ((char)(i+1) < 100)

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.