www.mikrocontroller.net

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

  • Datentypen[1] und
  • Compilezeit-Konstanten

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.

Hinweis
Um den berühmt-berüchtigten "Code-Bloat" durch Templates zu vermeiden, ist also eine gute Kenntnis der Hintergründe des Template-Mechanismus unabdingbar.

[Bearbeiten] Fußnoten

  1. Früher hatten Templates in C++ daher den Namen Parametrized Types
  2. Voraussetzung dafür ist, dass das Template eine Funktion und keine Klasse beschreibt und dass der parametrisierte Typ T aus den aktuellen Parametern erkannt werden kann. Hier: erwartet wird ein Zeiger auf T, übergeben werden mit &a und &b konkret Zeiger auf int, also muss es sich bei dem Typ T in diesem Aufruf um int handeln.
webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net