NablaSquaredG schrieb:
sollte das schon erfolgreich in irgendein register wegoptimiert werden, ganz gleich, wo die Variable definiert wird...
Ob Register oder nicht, spielt keine Rolle! Es kostet keine Zeit, eine Variable zu "erstellen", denn es gibt kein Erstellen! Selbst wenn das ganz ohne jede Optimierung übersetzt wird, so dass der Bezeichner 1:1 einer bestimmten Speicheradresse zugeordnet werden kann: Die Speicheradresse existiert sowieso! Die muss nicht erstellt, reserviert oder vorbereitet werden.
Stell dir vor, du hast ein Regal. Spielt es eine Rolle, wann du den Entschluss fasst, etwas an einem bestimmten Ort da drin abzustellen? Es mag Zeit brauchen, etwas an den Ort zu stellen und wieder heraus zu nehmen, aber Abstellen und herausnehmen möchtest du ja sowieso. Wie lange das Hineinlegen und Herausnehmen dauert ist aber vollkommen unabhängig davon, ob du den Entschluss dazu spontan fasst, wenn du etwas konkretes zum Ablegen hast (in der for-Schleife); oder den Platz im Voraus für etwas frei hältst, von dem du weißt, dass du es später ablegen musst (vor der for-Schleife).
Der wirkliche Unterschied ist, dass bei letzterem der Platz eventuell ungenutzt frei bleibt, weil nichts dort liegt, aber der Platz noch freigehalten wird. Wenn das Regal nicht viele Plätze hat, kann das relevant sein. Das ist es, was hustbaer meinte (siehe sein Beitrag). Bei solchen Mini-Funktionen mag der Optimierer auch von alleine erkennen können, wann genau etwas wo gebraucht wird und wann nicht, und er kann und wird sich dann einfach nicht an die Lebenszeit deiner Deklarationen halten (wie schon so oft gesagt: Variablen, Scopes, usw. sind alles Hilfsmittel für den Programmierer, es gibt sie nicht mehr im eigentlichen Programm). Wenn es wirklich kompliziert wird, kann das aber auch nicht gelingen, und man verhindert durch zu breit gefasste Gültigkeitsbereiche, dass der Optimierer optimal arbeiten kann. Am schlimmsten ist dies, wenn man Variablen global macht, weil der Optimierer sich dann nicht mehr darauf verlassen kann, dass diese Variable nicht von anderswo im Programm aus geändert wird.