POD (Plain Old Data) est une structure ou un type de données en C++ qui est compatible avec la structuration des données d'une manière classique comme en C et est parfaitement adapté à la programmation bas niveau.
Historique de la question:
POD a émergé comme un héritage du langage C pour garantir la compatibilité mémoire entre C et C++. Dans C++98, les objets POD avaient des restrictions strictes permettant une copie byte par byte ou une sérialisation directe.
Problème:
De nombreux programmeurs confondent POD avec de simples structures et ne tiennent pas compte des nuances de la norme, comme les règles d'agrégation ou la présence de constructeurs non standards, ce qui est critique pour la compatibilité ABI et les opérations bas niveau (memcpy, sérialisation).
Solution:
Dans le C++ moderne avec C++11, des notions comme trivial, trivially copyable et standard-layout ont été introduites pour clarifier les exigences.
Exemple de code:
struct PODType { int x; double y; }; static_assert(std::is_pod<PODType>::value, "Doit être POD"); static_assert(std::is_trivially_copyable<PODType>::value, "Trivially copyable"); static_assert(std::is_standard_layout<PODType>::value, "Standard layout");
Caractéristiques clés :
Peut-on faire un type POD avec des membres privés?
Non, le standard-layout exige soit que tous les membres soient publics, soit un accès uniforme (soit tous publics, soit tous privés/protégés).
Un classe sera-t-elle un type POD si elle a un constructeur utilisateur défini explicitement sans corps?
Non, la présence d'un constructeur utilisateur (même vide) rend le type non POD et non trivial.
Puis-je utiliser un type POD avec un destructeur virtuel ou des fonctions virtuelles?
Non, les méthodes virtuelles rendent le type non POD et non standard-layout.
Cas négatif
Un développeur sérialise une structure via memcpy, sans remarquer qu'un std::string (non POD) a été ajouté, les données deviennent incorrectes lors de la lecture.
Avantages:
Inconvénients:
Cas positif
L'ensemble de la structure est POD ou trival, sérialisation via memcpy, aucune référence ni conteneur std à l'intérieur.
Avantages:
Inconvénients: