style Quels sont les types de POD en C++?




c++ naming convention (6)

Un objet POD (plain old data) possède l'un de ces types de données - un type fondamental, un pointeur, une union, une structure, un tableau ou une classe - sans constructeur. Inversement, un objet non-POD est un objet pour lequel un constructeur existe. Un objet POD commence sa durée de vie lorsqu'il obtient le stockage avec la taille appropriée pour son type et sa durée de vie se termine lorsque le stockage de l'objet est réutilisé ou désalloué.

Les types PlainOldData ne doivent pas non plus contenir:

  • Fonctions virtuelles (soit les leurs, soit héritées)
  • Classes virtuelles de base (directes ou indirectes).

Une définition plus souple de PlainOldData inclut des objets avec des constructeurs; mais exclut ceux qui ont quelque chose de virtuel. Le problème important avec les types PlainOldData est qu'ils sont non polymorphes. L'héritage peut être fait avec les types de POD, cependant cela ne devrait être fait que pour ImplementationInheritance (réutilisation du code) et non pour le polymorphisme / sous-typage.

Une définition courante (mais pas strictement correcte) est qu'un type PlainOldData est tout ce qui n'a pas de VeeTable.

J'ai rencontré ce terme POD-type à quelques reprises. Qu'est-ce que ça veut dire?


Le concept de POD et le caractère de type std::is_pod seront obsolètes en C ++ 20. Voir this question pour plus d'informations.


Données anciennes

En bref, il s'agit de tous les types de données intégrés (par exemple, int , char , float , long , unsigned char , double , etc.) et toute l'agrégation de données POD. Oui, c'est une définition récursive. ;)

Pour être plus clair, un POD est ce que nous appelons «un struc».


Comme je comprends POD (PlainOldData) est juste une donnée brute - il n'a pas besoin:

  • être construit,
  • être détruit,
  • avoir des opérateurs personnalisés.
  • Ne doit pas avoir de fonctions virtuelles,
  • et ne doit pas remplacer les opérateurs.

Comment vérifier si quelque chose est un POD? Eh bien, il y a une structure pour ce qu'on appelle 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)>
  { };
}

(De l'en-tête type_traits)


Référence:


POD signifie Plain Old Data , c'est-à-dire une classe (définie avec le mot struct clé struct ou la class mots-clés) sans les constructeurs, les destructeurs et les fonctions de membres virtuels. L'article de Wikipedia sur POD va un peu plus en détail et le définit comme:

Une ancienne structure de données en C ++ est une classe agrégée qui contient uniquement des PODS en tant que membres, n'a aucun destructeur défini par l'utilisateur, aucun opérateur d'affectation de copie défini par l'utilisateur et aucun membre non statique du type pointeur vers membre.

Plus de détails peuvent être trouvés dans cette réponse pour C ++ 98/03 . C ++ 11 a changé les règles entourant POD, les relaxant considérablement, nécessitant ainsi une réponse de suivi ici .


Avec C ++, Plain Old Data ne signifie pas seulement que des choses comme int, char, etc sont les seuls types utilisés. Plain Old Data signifie en pratique que vous pouvez prendre une structure memcpy d'un endroit dans la mémoire à l'autre et les choses fonctionneront exactement comme vous vous y attendez (c'est-à-dire ne pas exploser). Cela casse si votre classe, ou n'importe quelle classe de votre classe, a comme membre un pointeur ou une référence ou une classe qui a une fonction virtuelle. Essentiellement, si les pointeurs doivent être impliqués quelque part, ce n'est pas Plain Old Data.





c++-faq