Plain Old Data (PODs) folgen dem C-Standardlayout. Damit können sie direkt mit den performanten C-Funktionen memcopy oder memmove kopiert, mit memset initialisiert oder auch mit memcmp verglichen werden.
PODs
PODs sind in klassischem C++ fundamentale Datentypen wie Wahrheitswerte, Ganzzahlen oder Fließkommazahlen. Diese Einschränkung ändert sich in C++11, den nun können selbst benutzerdefinierte Klassentypen wie Klassen und Strukturen PODs sein. Der Einfachheit halber spreche ich im weiteren Artikel nur noch von Klassen.
Welche Eigenschaften muss in C++11 eine Klasse erfüllen um ein POD zu sein? Eine Klasse ist ein POD, wenn sie trivial ist, ein Standardlayout besitzt und alle ihre nicht statischen Datenelemente auch PODs sind. Kompakt ist die Definition zwar, doch was bedeutet es, dass eine Klasse trivial ist und ein Standardlayout besitzt?
Nun liest sich der Standard wie ein juristischer Text.
Triviale Klasse
Eine Klasse ist trivial, wenn sie
- einen trivialen Default-Konstruktor besitzt.
- trivial kopierbar ist.
Eine trivial kopierbare Klasse ist eine Klasse, die
- keinen nicht-trivialen Copy- oder Move-Konstruktor besitzt.
- keinen nicht-trivialen Copy- oder Move-Zuweisungsoperator besitzt.
- einen trivialen Destruktor besitzt.
Nicht-trivial heißt vereinfachend gesprochen, dass die entsprechende Methode vom Entwickler implementiert wurde. Wird eine Methode direkt vom Compiler mit dem Schlüsselwort default angefordert oder erzeugt sie der Compiler automatisch, ist sie trivial.
Weiter geht es im C++-Standard mit dem Standardlayout.
Standardlayout
Eine Klasse besitzt ein Standardlayout, wenn sie
- keine virtuelle Funktion besitzt.
- keine virtuelle Basisklasse besitzt.
- keine Referenzen besitzt.
- keine verschiedenen Zugriffsspezifizierer (public, protected und private) besitzt.
Da ist es schon viel einfacher, den Compiler mit Hilfe der Type-Traits Bibliothek zu fragen, ob die Klasse ein POD ist.
Introspektion mit der Type-Traits Bibliothek
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
// pod.cpp
#include <iostream>
#include <type_traits>
struct Pod{
int a;
};
struct NotPod{
int i;
private:
int j;
};
int main(){
std::cout << std::boolalpha << std::endl;
std::cout << "std::is_pod<Pod>::value: " << std::is_pod<Pod>::value << std::endl;
std::cout << "std::is_pod<NotPod>::value: " << std::is_pod<NotPod>::value << std::endl;
std::cout << std::endl;
std::cout << "std::is_trivial<NotPod>::value: " << std::is_trivial<NotPod>::value << std::endl;
std::cout << "std::is_standard_layout<NotPod>::value: " << std::is_standard_layout<NotPod>::value << std::endl;
std::cout << std::endl;
}
|
Die Klasse Pod in den Zeilen 6 - 8 ist ein POD, die Klasse NotPod in den Zeilen 10 - 15 nicht. Die Antwort gibt uns die Funktion std::is_pod der Type-Traits Bibliothek in den Zeilen 21 und 22. Es geht noch genauer mit der Type-Traits Bibliothek. In den Zeilen 26 und 27 analysiere ich die Klasse NotPod einen Schritt weiter. Das Ergebnis ist, das NotPod zwar trivial ist, aber kein Standardlayout besitzt. NotPod besitzt kein Standardlayout, da die Variable i public, j hingegen private ist.
Die ganze Prosa in Anwendung zeigt die Ausgabe des Programms.
Was du immer schon wissen wolltest
In dem Artikel Automatik mit Methode im Linux-Magazin 08/2014 gehe ich detailliert auf das Schlüsselwort default ein.
Die Details zum Move-Konstruktor und den Move-Zuweisungsoperator kannst du in dem Artikel Rasch verschoben im Linux-Magazin 12/2012 nachlesen.
Wie geht's weiter?
Mit diesem technischen Artikel schließe ich vorerst die Miniserie rund um die Feature in C++ ab, die unter dem Performanzblickwinkel besonders interessant sind. Weiter geht es im nächsten Artikel mit den C++-Featuren zum sorgfältigen Umgang mit Ressourcen. Speichermanagement besitzt einen sehr hohen Stellenwert in der embedded Entwicklung. Um so besser, das C++11 mit den drei neuen Smart Pointern std:::shared_ptr, std::unique_ptr und std::weak_ptr das explizite Speichermanagement mit new fast überflüssig macht.
Go to Leanpub/cpplibrary "What every professional C++ programmer should know about the C++ standard library". Hole dir dein E-Book. Unterstütze meinen Blog.
Weiterlesen...