Forum: PC-Programmierung mehr oder weniger Variablen


von T_S (Gast)


Lesenswert?

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

Beispiel 1:
1
int a = 1;
2
int b = 2;
3
int c = 3;
4
int d = 4;
5
6
int e1, e2, e3, e4, f;
7
8
e1 = (a + b) * c - d;
9
e2 = a * b + c - d;
10
e3 = (a + b + c) * d;
11
e4 = a + b + c + d;
12
13
f = e1 * (e2 + e3) - e3;

oder

Beispiel 2:
1
int a = 1;
2
int b = 2;
3
int c = 3;
4
int d = 4;
5
6
int f;
7
8
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?

von P. S. (Gast)


Lesenswert?

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

von daniel (Gast)


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.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Du kannst es ja mal so schreiben:
1
f = c*a + c*b - 3*d + a*b + d*a + d*b + d*c - a - b

von Läubi .. (laeubi) Benutzerseite


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.

von Michael G. (linuxgeek) Benutzerseite


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.

von (prx) A. K. (prx)


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
1
char i;
2
char k = i + 1;
3
if (k < 100)
ist nicht identisch mit
1
if (i+1 < 100)
sondern entspricht
1
if ((char)(i+1) < 100)

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.