POD (Plain Old Data) is een structuur of datatype in C++ dat compatibel is met de standaard dat Structurering zoals in C en zeer geschikt is voor laag-niveau programmeren.
Achtergrond:
POD is ontstaan als een erfenis van de taal C, om geheugencompatibiliteit tussen C en C++ te waarborgen. In C++98 hadden POD-objecten strenge beperkingen om ze eenvoudig byte-voor-byte te kunnen kopiëren of direct te serialiseren.
Probleem:
Veel programmeurs verwarren POD met alleen eenvoudige structuren en houden geen rekening met de nuances van de standaard, zoals aggregatieregels of de aanwezigheid van niet-standaardconstructors, wat cruciaal is voor ABI-compatibiliteit en laag-niveau operaties (memcpy, serialisatie).
Oplossing:
In modern C++ met C++11 zijn de concepten triviaal, trivially copyable en standard-layout geïntroduceerd, die de vereisten duidelijker scheiden.
Voorbeeldcode:
struct PODType { int x; double y; }; static_assert(std::is_pod<PODType>::value, "Moet POD zijn"); static_assert(std::is_trivially_copyable<PODType>::value, "Trivially copyable"); static_assert(std::is_standard_layout<PODType>::value, "Standaardindeling");
Belangrijkste kenmerken:
Kan ik een POD-type maken met privéleden?
Nee, standard-layout vereist of alle leden public of uniforme toegang (of allemaal public of allemaal private/protected).
Zal een klasse een POD-type zijn als deze expliciet een gebruikersconstructor zonder lichaam heeft gedefinieerd?
Nee, de aanwezigheid van een gebruikersconstructor (zelfs een lege) maakt het type geen POD en niet triviaal.
Kan ik een POD-type gebruiken met een virtuele destructor of virtuele functies?
Nee, virtuele methoden maken het type geen POD en geen standard-layout.
Negatieve casus
De ontwikkelaar serialiseert een structuur via memcpy, zonder op te merken dat er een std::string (niet POD) aan is toegevoegd, waardoor de gegevens incorrect worden bij het lezen.
Voordelen:
Nadelen:
Positieve casus
De gehele structuur is POD of triviaal, serialisatie is met memcpy, geen verwijzingen en std-containers binnenin.
Voordelen:
Nadelen: