Die Konstantenfaltung (englisch Constant Folding) ist eine einfache und wirkungsvolle Compiler-Optimierung: Ausdrücke, deren Werte schon zur Übersetzungszeit bekannt sind, werden sofort berechnet, statt zur Laufzeit. Aus 2 + 3 macht der Compiler schon beim Übersetzen 5.
Beispiele
int x = 2 * 3 + 1; // wird zu: int x = 7;
double d = 0.5 * 200; // wird zu: double d = 100.0;
if (1 < 2) { ... } // Bedingung ist immer wahr → fest gebunden
Das Programm verhält sich danach exakt so, als wäre der ursprüngliche Ausdruck ausgeführt worden — die as-if-Regel erlaubt die Umformung, weil das beobachtbare Verhalten gleich bleibt. Entfernt werden nur überflüssige Berechnungen.
Wo und wann der Compiler faltet
Die Faltung läuft meist auf dem Abstrakten Syntaxbaum oder auf der Zwischendarstellung wie dem Drei-Adress-Code und gehört zu den allerersten Optimierungen im Compiler, noch vor aufwendigeren Verfahren. Sie ist die Grundlage weiterer Optimierungen: Wird eine Konstante etwa zu 0 gefaltet, kann der Compiler ganze if-Zweige als toten Code entfernen.
Konstantenfaltung und Konstantenpropagierung
Die Faltung wertet Ausdrücke aus konstanten Operanden aus. Die verwandte Konstantenpropagierung ersetzt dagegen Variablen, deren Wert sicher bekannt ist, durch diesen Wert — beide arbeiten oft zusammen:
int a = 5; // Propagierung: a ist überall 5
int b = a + 3; // nach Propagierung: b = 5 + 3 → Faltung: b = 8
In C++ treibt das Sprachfeature constexpr die Idee auf die Spitze: Funktionen können so deklariert werden, dass sie garantiert zur Übersetzungszeit ausgewertet werden dürfen, solange ihre Argumente Konstanten sind.
Wo die Faltung Grenzen hat
Der Compiler darf nur falten, wenn das Ergebnis identisch ausfällt. Deshalb unterlässt er die Faltung, wenn semantische Fallstricke entstehen würden:
- Division durch null:
x / 0wird nicht gefaltet, sonst entstünde ein Fehler, den das Programm zur Laufzeit gar nicht hätte. - Ganzzahl-Overflow: In Sprachen wie C ist ein Überlauf undefined behavior; der Compiler faltet nicht in Bereiche, die das Verhalten ändern könnten.
- Gleitkomma und
volatile: Beivolatile-Variablen und speziellen Gleitkomma-Einstellungen (NaN, Rundungsmodus) ist der Zugriff selbst beobachtbar und bleibt unangetastet.
Gut gefaltete Konstanten landen am Ende als unmittelbare Werte im Maschinencode — als Immediate-Operanden, ohne dass die CPU zur Laufzeit noch rechnen muss. Zusammen mit der Codegenerierung sorgt die Faltung so für kleinere und schnellere Programme.