Suchen

Programmierung zur Compilezeit

Seite: 3/3

Firma zum Thema

Konstante Ausdrücke

Konstante Ausdrücke können zur Compilezeit evaluiert und im ROM gespeichert werden. Sie geben dem Compiler tiefen Einblick in den Sourcecode und sind implizit threadsicher.

Konstante Ausdrücke gibt es als Variablen, benutzerdefinierte Typen und Funktionen. Im Gegensatz zu Template Metaprogrammierung erlauben sie das Programmieren zur Compilezeit im imperativen Stil.

Bildergalerie

Bildergalerie mit 12 Bildern

Damit konstante Ausdrücke zur Compilezeit evaluiert werden können, gilt es ein paar Regeln zu beachten.

  • Variablen sind implizit const und müssen durch konstante Ausdrücke initialisiert werden: constexpr double pi= 3.14;
  • Benutzerdefinierte Typen können keine virtuelle Basisklasse besitzen. Ihr Konstruktor muss vom Compiler erzeugt werden und selbst ein konstanter Ausdruck sein. Methoden, die Objekte von benutzerdefinierten Typen verwenden, müssen konstante Ausdrücke und können nicht virtuell sein.
  • Funktionen können keine statische und thread_local Variablen enthalten.

Die gcd-Funktion ist ein konstanter Ausdruck. Sind ihre Argumente auch konstante Ausdrücke, kann sie zur Compilezeit evaluiert werden. Genau das zeigt das Programm in Bild 10 (vgl. Bildergalerie).

Ein tiefer Blick in den Objektcode zeigt, dass die Ergebnisse der gcd-Aufrufe bereits zur Compilezeit vorliegen (vgl. Bild 11 in der Bildergalerie).

Konstante Ausdrücke versus Template Metaprogrammierung

constexpr-Funktionen unterscheiden sich im Detail deutlich von Metafunktionen, die bei der Template Metaprogrammierung zum Einsatz kommen. So können konstante Ausdrücke zur Compile- und Laufzeit ausgeführt werden, Sprung- und Iterationsanweisungen sowie auch bedingte Anweisungen enthalten. Darüber hinaus unterstützen constexpr-Funktionen das Verändern von Daten und das Arbeiten mit Fließkommazahlen.

Programmierung zur Compilezeit als mächtiges Werkzeug

Template Metaprogrammierung, die Type-Traits Bibliothek und konstante Ausdrücke haben gemein, dass sie zu Compilezeit ausgeführt werden. Während Template Metaprogrammierung aber ein tiefes Verständnis von rein funktionaler Programmierung voraussetzt, ist der Einsatz der neuen C++11 Type-Traits Bibliothek deutlich intuitiver für den imperativ geschulten Programmierer. Nur die Namenskonventionen erinnern an Template Metaprogrammierung. Konstante Ausdrücke mit dem C++14-Standard erlauben direkt das Programmieren im imperativen Stil (vgl. Bild 12 in der Bildergalerie).

Mit der Type-Traits Bibliothek und den konstanten Ausdrücken verliert Programmierung zur Compilezeit seinen Charakter als Werkzeug für den C++-Experten. Programmierung zur Compilezeit wird damit zu einem mächtigen Werkzeug in der Werkzeugbox des C++-Entwicklers, um korrekte und performante Programme zu schreiben.

Weiterführende Information

  • [1]: Turing-Vollständigkeit: https://de.wikipedia.org/wiki/Turing-Vollst%C3%A4ndigkeit
  • [2]: Boost-Bibliothek: http://www.boost.org/
  • Rainer Grimm, „C++11 für Programmierer“, O’Reilly 2013
  • Rainer Grimm, „Modernes C++ in der Praxis“, Serie im Linux-Magazin seit 2011

* Rainer Grimm ist seit vielen Jahren als Softwareentwickler und Schulungsleiter tätig. Seit 2013 ist er als Softwarearchitekt und Gruppenleiter bei der schwäbischen Firma Metrax beschäftigt. Insbesondere die Software auf den Defibrillatoren ist ihm eine Herzensangelegenheit. Seine Bücher "C++11 für Programmierer", "C++" und "C++-Standardbibliothek" für die „kurz und gut“-Reihe sind beim Verlag O'Reilly erschienen.

(ID:44192399)