Erweiterte Plain Old Data

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.

POD

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.

 

 

 

 

 

 

 

 

 

title page smalltitle page small 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.

 

Mentoring

Stay Informed about my Mentoring

 

Rezensionen

Tutorial

Besucher

Heute 763

Gestern 2770

Woche 16315

Monat 62260

Insgesamt 3526566

Aktuell sind 92 Gäste und keine Mitglieder online

Kubik-Rubik Joomla! Extensions

Abonniere den Newsletter (+ pdf Päckchen)

Beiträge-Archiv

Sourcecode

Neuste Kommentare