|
|
Templates (C-Plusplus)Templates in C++ – mitunter auch Schablonen genannt – erlauben die "generische Programmierung". Bei der Programmierung von Mikrocontrollern in C++ sind Templates deshalb interessant, weil sie zum Zeitpunkt der Kompilierung greifen und damit zu weniger Overhead führen (können) als universelle Bibliotheksfuntionen, deren Leistungsumfang von einer konkreten Applikation nur teilweise benutzt wird. Da Templates nur einmalig hinterlegt sind, vermeiden sie die Nachteile der Copy-und-Paste-Programmierung. Ähnlich wie parametrisierte Makros kann man Templates als Quelltexte verstehen, die einmal geschrieben und häufig eingesetzt werden – jeweils mit mehr oder weniger großen Variationen. Insbesondere lassen sich mit Templates
parametrisieren, das heißt bis zu einer konkreten Verwendung einer Template (= Instanziierung) offen halten. Als Beispiel hier eine Template(-Funktion) zum Vertauschen von zwei Ganzzahlen:
template<typename T>
void swap(T* xp, T* yp) {
T tmp; tmp = *xp; *xp = *yp; *yp = tmp;
}
Die erste Zeile erklärt dabei dem C++-Compiler, dass das nachfolgend verwendete Symbol T einen beliebigen Typnamen repräsentiert. Ohne diese Zeile würde man eine Fehlermeldung wegen eines undefinierten Namens erhalten. Bei der späteren, tatsächlichen Verwendung dieser Funktion kann man einen konkreten Typ angeben: int a, b; double c, d; struct s e, f; ... swap<int>(&a, &b); swap<double>(&c, &d); swap<struct s>(&e, &f); oder – noch einfacher – lässt den Compiler aus dem Typ des verwendeten Template-Arguments auf den Typ von T schließen[2]: swap(&a, &b); swap(&c, &d); swap(&e, &f); Beim Programmieren mit Templates sollte allerdings auf die Minimierung von Abschnitten geachtet werden, für die der erzeugte Code nicht mit den Template-Parametern variiert, zumindest dann, wenn eine Template typischerweise in ein und demselben Quelltext mehrfach mit unterschiedlichen Parametern verwendet wird. Für das obige Beispiel ist das insofern der Fall, als Zuweisungen in der Template-Funktion Machinencode erzeugen werden, der für die unterschiedlichen Datentypen jeweils verschieden ausfällt z. B. ein MOV-Befehl für 2 oder 4 Byte bei für die Verwendung mit int, 8 Byte für double und vielleicht einen memmove-Aufruf für die Strukturzuweisung. Andererseits könnte der Aufruf von swap mit den Datentypen long und float dazu führen, dass aufgrund der Template zwei Funktionen instanziiert werden, die vom Maschinencode her identisch sind (wenn float und long beide 4 Byte haben). Das selbe gilt bei der Verwendung von swap mit verschiedenen Struktur-Typen der selben Größe.
[Bearbeiten] Fußnoten
|