Compiler
Welche Berechnung in der obigen Schleife ist Ziel der Verschiebung von schleifeninvarianten Ausdrücken (Loop-Invariant Code Motion, aus der Schleife heraus)? (x und y werden in der Schleife nicht verändert.)
for (i = 0; i < n; i++)
a[i] = b[i] * (x * y);
- Ab[i] * (x * y) insgesamt
- Bx * y
- CDie Zuweisung an a[i]
Antwort und Erläuterung anzeigen
Antwort: B. x * y
Die Verschiebung schleifeninvarianter Ausdrücke ist eine Optimierung, bei der Berechnungen, die in jeder Iteration denselben Wert liefern, vor die Schleife gezogen und nur einmal berechnet werden. Da x und y sich in der Schleife nicht ändern, ist x * y in jeder Iteration gleich, und t = x * y kann vor der Schleife berechnet und a[i] = b[i] * t verwendet werden. b[i] ist für jedes i verschieden, daher kann b[i] * (x * y) insgesamt nicht verschoben werden. Auch die Zuweisung an a[i] schreibt in jeder Iteration ein anderes Element und bleibt in der Schleife.