Der Begriff POD-Typ ist mir schon ein paar Mal begegnet.
Was bedeutet das?
- Was sind Aggregate und PODs und warum sind sie so besonders? (5 Antworten )
Antworten
Zu viele Anzeigen?Soweit ich weiß, handelt es sich bei POD (PlainOldData) nur um Rohdaten, die nicht benötigt werden:
- gebaut werden,
- zerstört werden,
- um benutzerdefinierte Operatoren zu haben.
- Darf keine virtuellen Funktionen haben,
- und darf die Operatoren nicht außer Kraft setzen.
Wie kann man überprüfen, ob etwas ein POD ist? Nun, dafür gibt es 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 header type_traits)
Referenz:
Ein POD-Objekt (plain old data) hat einen dieser Datentypen - einen Grundtyp, Zeiger, Union, struct, Array oder Klasse - ohne Konstruktor. Umgekehrt ist ein Nicht-POD-Objekt ein Objekt, für das ein Konstruktor existiert. Die Lebensdauer eines POD-Objekts beginnt, wenn es Speicherplatz mit der richtigen Größe für seinen Typ erhält, und sie endet, wenn der Speicherplatz für das Objekt entweder wiederverwendet oder freigegeben wird.
PlainOldData-Typen dürfen auch keine der folgenden Eigenschaften haben:
- Virtuelle Funktionen (entweder ihre eigenen oder geerbte)
- Virtuelle Basisklassen (direkt oder indirekt).
Eine lockerere Definition von PlainOldData schließt Objekte mit Konstruktoren ein, schließt aber solche mit virtuellen Elementen aus. Der wichtige Punkt bei PlainOldData-Typen ist, dass sie nicht polymorph sind. Vererbung kann mit POD-Typen durchgeführt werden, sollte aber nur für ImplementationInheritance (Wiederverwendung von Code) und nicht für Polymorphismus/Subtyping erfolgen.
Eine gängige (wenn auch nicht ganz korrekte) Definition ist, dass ein PlainOldData-Typ alles ist, was keine VeeTable hat.
Das Konzept der POD und das Typenmerkmal std::is_pod
wird in C++20 veraltet sein. Siehe diese Frage für weitere Informationen.
Bei C++ bedeutet "Plain Old Data" nicht nur, dass Dinge wie int, char usw. die einzigen verwendeten Typen sind. Plain Old Data bedeutet in der Praxis, dass man eine Struktur mit memcpy von einer Speicherstelle zu einer anderen verschieben kann und die Dinge genau so funktionieren, wie man es erwarten würde (d.h. nicht explodieren). Dies ist nicht der Fall, wenn Ihre Klasse oder eine Klasse, die Ihre Klasse enthält, einen Zeiger oder eine Referenz oder eine Klasse mit einer virtuellen Funktion als Mitglied hat. Wenn Zeiger irgendwo involviert sind, handelt es sich im Grunde genommen nicht um Plain Old Data.
- See previous answers
- Weitere Antworten anzeigen