Compilers
Welke berekening in de bovenstaande lus komt in aanmerking voor loop-invariant code motion (verplaatsing buiten de lus)? (x en y worden in de lus niet gewijzigd.)
for (i = 0; i < n; i++)
a[i] = b[i] * (x * y);
- AHet geheel b[i] * (x * y)
- Bx * y
- CDe toewijzing aan a[i]
Antwoord en toelichting tonen
Antwoord: B. x * y
Loop-invariant code motion is een optimalisatie waarbij berekeningen die bij elke iteratie dezelfde waarde opleveren vóór de lus worden gebracht en maar één keer worden berekend. Omdat x en y in de lus niet veranderen, is x * y bij elke iteratie gelijk; t = x * y kan vóór de lus worden berekend en a[i] = b[i] * t volstaat. b[i] verschilt per i, zodat het geheel b[i] * (x * y) niet kan worden verplaatst. De toewijzing aan a[i] is bij elke iteratie een schrijfactie naar een ander element en blijft in de lus.