Unter der Spezialisierung der Funktion versteht man eine Kopie dieser Funktion, die unter bestimmten Annahmen optimiert werden kann.
Das folgende Programm zeigt, dass die Spezialisierung von Funktionen, viele andere Optimierungen ermöglicht:
int x;
int y;
int f(int a, int b)
{
switch (a) {
case 0: return b;
case 1: return 3 * b;
case 2: return 6 * b;
case 3: return 13 * b;
...
default: return b * b;
}
}
int main(void)
{
int x1 = f(0, y);
int x2 = f(x, 0);
f(x, y);
return x1 + x2;
}
Die Funktion f kann hier sehr groß sein, weshalb der Compiler vom Inlining [1] der Funktionsaufrufe absieht.
Allerdings kann er z.B. eine Spezialisierung f1 von f erstellen, die annimmt, dass der erste Funktionsparameter immer 0 ist:
int f1(int b)
{
switch (0) {
case 0: return b;
case 1: return 3 * b;
case 2: return 6 * b;
case 3: return 13 * b;
...
default: return b * b;
}
}
Da der Wert des switch-Statements in f1 bekannt ist, kann die Funktion anschließend stark vereinfacht werden.
[1] https://de.wikipedia.org/wiki/Inline-Ersetzung
Aufgabe:
- Implementierung von Funktionsspezialisierung
- Erarbeiten von Kriterien, wann die Funktionsspezialisierung vorteilhaft ist
Voraussetzungen
- Spaß am Compilerbau
- Gute Programmierkenntnisse in C
Veröffentlichungen
Betreuer
Studenten