style - c++ naming convention




Quels sont les types de POD en C++? (5)

Très informellement:

Un POD est un type (incluant les classes) où le compilateur C ++ garantit qu'il n'y aura pas de "magie" dans la structure: par exemple des pointeurs cachés sur vtables, des décalages appliqués à l'adresse quand elle est castée à d'autres types ( au moins si le POD de la cible aussi), les constructeurs, ou les destructeurs. Grosso modo, un type est un POD lorsque les seules choses qui s'y trouvent sont des types et des combinaisons intégrés. Le résultat est quelque chose qui "agit comme" un type C.

Moins informellement:

  • int , char , wchar_t , bool , float , double sont des POD, tout comme les versions long/short et signed/unsigned d'entre eux.
  • les pointeurs (y compris le pointeur vers la fonction et le pointeur vers le membre) sont des POD,
  • enums sont des POD
  • un POD const ou volatile est un POD.
  • une class , une struct ou une union de POD est un POD à condition que tous les membres de données non statiques soient public , et qu'il n'y ait aucune classe de base et aucun constructeur, destructeur ou méthode virtuelle. Les membres statiques n'arrêtent pas que quelque chose soit un POD selon cette règle.
  • Wikipédia a tort de dire qu'un POD ne peut pas avoir de membres de type pointeur à membre. Ou plutôt, c'est correct pour le libellé C ++ 98, mais TC1 a rendu explicite que les pointeurs-à-membres sont POD.

Formellement (C ++ 03 Standard):

3.9 (10): «Les types arithmétiques (3.9.1), les types d'énumération, les types de pointeurs et les pointeurs vers les types de membres (3.9.2) et les versions cv-qualifiées de ces types (3.9.3) sont collectivement les types scalaires de l'appelant. les types POD-struct, POD-union types (article 9), les tableaux de ces types et les versions cv-qualifiées de ces types (3.9.3) sont collectivement appelés types POD "

9 (4): "Une structure POD est une classe agrégée qui n'a pas de données non statiques membres de type non-POD-struct, non-POD-union (ou tableau de tels types) ou de référence, et n'a pas de définir un opérateur de copie et pas de destructeur défini par l'utilisateur De même une union POD est une union agrégée qui n'a pas de données non statiques membres de type non-POD-struct, non-POD-union (ou tableau de tels types) ou référence, et n'a aucun opérateur de copie défini par l'utilisateur et aucun destructeur défini par l'utilisateur.

8.5.1 (1): "Un agrégat est un tableau ou une classe (article 9) sans constructeur déclaré par l'utilisateur (12.1), sans membre de données privé ou protégé non statique (article 11), pas de classe de base (article 10) et pas de fonctions virtuelles (10.3). "

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


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.


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.


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.


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 .





c++-faq