Ich stosse gelegentlich auf ein (irgendwie faszinierendes) Dilemma:
Vielleicht kennt ihr solche Situationen und habt da irgendein Rezept, auf das ich noch nicht gekommen bin.
Es geht darum, dass ich in einer Schleife einen Teil habe, der immer ausgeführt werden soll und ein anderer, der an eine Bedingung geknüpft ist.
Allerdings ist es so, dass der Wert, der die Bedingung steuert, nur einmal initial festgelegt wird und sich danach über alle Schleifeniterationen nicht mehr ändert.
Natürlich wird (muss) jetzt aber trotzdem in jedem Schleifendurchgang eine Auswertung des if-statements erfolgen.
Ist das tatsächlich so, dass man hier nur mittels Codeduplikation entgegenwirken kann (was ich nicht so schön fände)?
Oder übersehe ich da vielleicht eine bessere Möglichkeit.
In Assembly könnte man ja einmal die Sprungmarke ausrechnen und danach immer - und ohne compare - an die entsprechende Stelle springen.
Aber in C(++) scheint das irgendwie nicht möglich zu sein.
Auch mit goto kann ich bekanntlich nur an "konstante" Labels springen. Ich kann also das Label vorher nicht "ausrechnen".
Beispiel
Code: Alles auswählen
for(int i = 0; i < count; ++i)
{
// Block A) der immer ausgeführt wird.
// Berechnungen, deren Resultate im condition Block später benötigt werden.
// condition wird in jedem Schleifendurchgang geprüft, was eigentlich nicht nötig wäre
if(condition) // condition steht beim Eintritt in die Funktion fest und ändert sich danach nicht mehr
{
// Block B)
// Resultate von Block A) werden benötigt.
}
}
Code: Alles auswählen
if(condition) for(int i = 0; i < count; ++i)
{
// Block A)
}
else for(int i = 0; i < count; ++i)
{
// Block A) // Codeduplikation von oberhalb
// Block B)
}
Ist das Problem irgendwie bekannt?
Edit:
In der Theorie könnte man wohl den zu ausführenden Maschinencode an der Stelle dynamisch erzeugen.
Das kommt mir aber irgendwie kriminell vor und vermutlich dürfte das OS entschieden etwas gegen solche Versuche haben. :-)