ts-soft hat geschrieben:Zwar wird das Register nicht runtergezählt, sondern V,
aber das sollte wurscht sein?
Registerzugriffe sind Grössenordnungen schneller als Speicherzugriffe.
NicknameFJ hat geschrieben:Das kann eigentlich nicht sein, dass der Compiler dies so optimiert. Und zwar aus folgender Überlegung heraus: Wenn die Laufvariable nur in einem Register geführt wird, hat man innerhalb der Schleife noch keinen Zugriff auf den jeweiligen Wert der PB-Variablen. Man könnte meinen dass dann der Compiler dies nur dann optimiert (=Laufvariable ausschließlich im Register hält) wenn innerhalb der Schleife nicht auf die Laufvar. zugegriffen wird. Angesicht der vielen Möglichkeiten scheint hier Prüfung ob eine Optimierung zulässig ist fast unmöglich.
Einige Varianten wo z.B. nicht optimiert werden dürfte:
Laufvariable ist eine globale Var., innerh. der Schleife wird eine andere Procedure aufgerufen, die Laufvar. könnte innerhalb der procedure auch shared sein , oder innerhalb der Schleife wird mit Gosub irgendwohin gesprungen, auch hier muss der Wert der (lokalen) Laufvar. bekannt sein; schließlich kann der Compiler nicht den Programmablauf nachvollziehen um zu sehen ob der Wert der Laufvariablen nicht während der Schleife benötigt wird.
Auch könnte es sein, dass ein Thread läuft in dem auf die ggfs. globale Laufvar. zugegriffen wird usw. Es scheint nahezu unmöglich alles zu prüfen ob nicht irgendwo der Wert der Laufvar. gebraucht wird
Man zerlegt den Code üblicherweise in Blöcke von Operationen. Im einfachsten Fall sind alle Sprungmarken sowie Anfang und Ende jeweils Grenzen eines Blockes. Innerhalb des Blockes findet keine Referenz von aussen statt. Schleifenvariablen sind üblicherweise lokal und daher von einem zweiten Thread aus gar nicht sichtbar. Nimmt man eine globale oder "shared" Variable als Schleifenvariable, dann erzeugt der Compiler anderen Code (nicht mehr in Registern haltbar, siehe "volatile" keyword in anderen Sprachen). Genauso verändern sich die Optimierungsstrategien erheblich wenn Float Werte für eine Schleife genutzt werden.
Ein viel grösseres Problem als volatile/shared Variablen, sind indirekte Zugriffe auf Variablen (per Pointer). In solchen Fällen kann der optimierte Code ungültig werden. Generell muss man deshalb bei agressiven Optimierungen aufpassen und bei der Source Entwicklung (in C etwa) schon im Hinterkopf haben welche der Optimierungsstrategien man später nutzen will bzw. sich verbaut.
Den Schleifenzähler in einem Register zu halten ist aber eine der einfachsten Optimierungen für Schleifen bei Compilern.
Übersicht zum Einstieg:
http://de.wikipedia.org/wiki/Compiler#P ... Chrlich.29