Compiler

Was geschieht mit dem erzeugten Code, wenn bei der Registerzuteilung ein „Spill“ auftritt?

  1. ABefehle zum Auslagern in den Stack und Zurücklesen kommen hinzu, und der Code wird tendenziell langsamer
  2. BDie Zahl der Register steigt automatisch, sodass alle Werte in Registern liegen können
  3. CNicht verwendete Werte werden entfernt, und die Zahl der Befehle sinkt
Antwort und Erläuterung anzeigen

Antwort: A. Befehle zum Auslagern in den Stack und Zurücklesen kommen hinzu, und der Code wird tendenziell langsamer

Ein Spill bedeutet, dass einige Werte im Speicher (Stack) abgelegt werden, wenn mehr Werte gleichzeitig lebendig sind, als Register vorhanden sind. Für jede Verwendung dieses Werts ist ein Ladebefehl und für jede Änderung ein Speicherbefehl nötig, sodass die Befehlszahl steigt und der Code durch die Speicherzugriffe tendenziell langsamer wird. Der Compiler behält daher häufig verwendete Werte, etwa in Schleifen, in Registern und lagert selten verwendete Werte aus. Die Registerzahl ist durch die CPU festgelegt und wächst nicht, und das Entfernen unnötiger Werte ist eine andere Sache.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Compiler

  1. Was ist das Hauptziel der Befehlsplanung (Instruction Scheduling) des Compilers?
  2. Welche Wirkung hat es, wenn auf den letzten rekursiven Aufruf der obigen Funktion die Tail-Call-Optimierung angewendet wird?
  3. Welche Aussage zum Unterschied zwischen Compiler und Interpreter ist richtig?
  4. Welche Eigenschaft einer Laufzeitumgebung mit JIT-Kompilierung ist richtig?
  5. Welche Beschreibung des grundlegenden Aufbaus von LLVM ist richtig?

Vergleiche zu diesem Thema