[c++] Was sind POD-Typen in C ++?


Answers

Sehr informell:

Ein POD ist ein Typ (einschließlich Klassen), in dem der C ++ - Compiler garantiert, dass es in der Struktur keine "Magie" gibt: zum Beispiel versteckte Zeiger auf Vtables, Offsets, die auf die Adresse angewendet werden, wenn sie in andere Typen umgewandelt wird ( zumindest wenn der POD des Ziels auch), Konstruktoren oder Destruktoren. Grob gesagt, ein Typ ist ein POD, wenn die darin enthaltenen Dinge eingebaute Typen und Kombinationen davon sind. Das Ergebnis ist etwas, das sich wie ein C-Typ verhält.

Weniger informell:

  • int , char , wchar_t , bool , float , double sind PODs, ebenso wie long/short und signed/unsigned Versionen von ihnen.
  • Pointer (einschließlich Pointer-to-Function und Pointer-to-Member) sind PODs,
  • enums sind PODs
  • Ein const oder volatile POD ist ein POD.
  • Eine class , struct oder union von PODs ist ein POD, vorausgesetzt, dass alle nicht statischen Datenelemente public sind und keine Basisklasse und keine Konstruktoren, Destruktoren oder virtuellen Methoden vorhanden sind. Statische Mitglieder halten unter dieser Regel nichts davon ab, ein POD zu sein.
  • Wikipedia sagt falsch, dass ein POD keine Member vom Typ pointer-to-member haben darf. Oder eher, es ist korrekt für die C ++ 98 Formulierung, aber TC1 machte explizit, dass Zeiger-zu-Mitglied POD sind.

Formal (C ++ 03 Standard):

3.9 (10): "Arithmetische Typen (3.9.1), Aufzählungstypen, Zeigertypen und Zeiger auf Elementtypen (3.9.2) und cv-qualifizierte Versionen dieser Typen (3.9.3) werden kollektiv als Skalar-Typen verwendet Typen, POD-Strukturtypen, POD-Union-Typen (Abschnitt 9), Arrays dieser Typen und CV-qualifizierte Versionen dieser Typen (3.9.3) werden zusammen als POD-Typen bezeichnet.

9 (4): "Eine POD-Struktur ist eine Aggregatklasse, die keine nicht statischen Datenelemente vom Typ Nicht-POD-Struktur, Nicht-POD-Union (oder Array von solchen Typen) oder Referenz hat und keine Benutzer- define copy operator und kein benutzerdefinierter Destruktor Ähnlich ist eine POD-Union eine Aggregatunion, die keine nicht statischen Datenelemente vom Typ non-POD-struct, nicht-POD-union (oder Array solcher Typen) oder Referenzen hat, und hat keinen benutzerdefinierten Kopieroperator und keinen benutzerdefinierten Destruktor.

8.5.1 (1): "Ein Aggregat ist ein Array oder eine Klasse (Klausel 9) ohne von Benutzern deklarierte Konstruktoren (12.1), keine privaten oder geschützten nicht statischen Datenelemente (Klausel 11), keine Basisklassen (Klausel 10). und keine virtuellen Funktionen (10.3). "

Question

Ich bin diesen Begriff POD-Typ ein paar Mal begegnet. Was heißt das?




Das Konzept von POD und der Typ Trait std::is_pod wird in C ++ 20 veraltet sein. Siehe this Frage für weitere Informationen.




Wie ich weiß, POD (PlainOldData) ist nur ein Rohdaten - es braucht nicht:

  • gebaut werden,
  • zerstört sein,
  • benutzerdefinierte Benutzer haben.
  • Darf keine virtuellen Funktionen haben,
  • und darf Operatoren nicht überschreiben.

Wie überprüft man, ob etwas ein POD ist? Nun, es gibt eine Struktur namens std::is_pod :

namespace std {
// Could use is_standard_layout && is_trivial instead of the builtin.
template<typename _Tp>
  struct is_pod
  : public integral_constant<bool, __is_pod(_Tp)>
  { };
}

(Aus Überschrift type_traits)


Referenz:






Links