Lokale Variablen

Was mir gerade mal wieder bei meinem Hiwi-Job aufgefallen ist, als ich mit altem Code zu tun hatte: Viele Leute scheinen irgendwie davon auszugehen, daß lokale Variablen irgendwie teuer sind …

Entsprechend steht dann sowas wie

m.insert(obj.get(i), obj.get(i).value());

statt

Typ tmp = obj.get(i);
m.insert(tmp, tmp.value());

Lokale Variablen werden üblicherweise in Registern gehalten, nur wenn die nicht reichen, auf dem Stackframe. Zwischenergebnisse in Ausdrücken müssen ja auch irgendwo gespeichert werden, sind also im Prinzip das gleiche wie alias-freie lokale Variablen. Wenn man sich einen Datenflußgraphen anschaut, macht es daher auch überhaupt keinen Unterschied – normalerweise.

Im vorliegenden Fall liegt der Unterschied darin, daß im ersten Fall get(i) zweimal, im zweiten Fall dagegen nur einmal aufgerufen werden muß. Natürlich kann es semantische Unterschiede geben, wenn get() nicht seiteneffektfrei ist. Aber als Programmierer sollte man das wissen. Der Compiler dagegen weiß es nicht so ohne weiteres, und kann es außer in ganz trivialen Fällen auch nicht vernünftig feststellen, muß es also meist bei zwei Aufrufen belassen, die nicht durch common subexpression elimination beseitigt werden können.

Wir halten fest: Das zweite Beispiel ist besser lesbar und resultiert jedenfalls nicht in schlechterem Code als das erste.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht.

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>