943 votes

Quels sont les types POD en C++ ?

Je suis tombé sur cette expression POD-type quelques fois... ce que cela signifie ?

674voto

Greg Hewgill Points 356191

POD est synonyme de Plain Old Données - qui est, struct (ou class) sans les constructeurs, destructeurs et les membres virtuels fonctions. Wikipédia article sur POD va dans un peu plus en détail et le définit comme:

Un simple Vieux Structure de Données en C++ est un agrégat de classe qui ne contient que des GOUSSES en tant que membres, n'a pas défini par l'utilisateur destructeur, aucun utilisateur défini par l'opérateur d'assignation de copie, et pas non membres de pointeur de type de membre.

Plus de détails peuvent être trouvés dans cette réponse pour le C++98/03. C++11 a modifié les règles entourant POD, de détente grandement, donc nécessitant un suivi de la réponse ici.

341voto

Steve Jessop Points 166970

De façon très informelle:

Un POD est un type (y compris les classes) où le compilateur C++ garantit qu'il n'y aura pas de "magie" dans la structure: par exemple cachés des pointeurs vers vtables, les compensations qu'appliquées à l'adresse quand il est jeté à d'autres types (au moins si la cible POD trop), des constructeurs ou destructeurs. Grosso modo, un type est une GOUSSE, les seuls choses sont intégrés dans les types et combinaisons d'entre eux. Le résultat est quelque chose qui "agit" comme un C type.

Moins de manière informelle:

  • int, char, wchar_t, boolean, float, double sont des Gousses, comme le sont long/court et signé/non signé versions.
  • les pointeurs (y compris le pointeur à la fonction et pointeur-à-membres) sont des Gousses,
  • les énumérations sont des Gousses
  • const ou volatile POD est une GOUSSE.
  • une class, struct ou union de Dosettes est un POD à condition que toutes les données membres statiques sont publiques, et il n'a pas de classe de base et non les constructeurs, destructeurs, ou des méthodes virtuelles. Les membres statiques ne vous arrêtez pas quelque chose qui est une GOUSSE vertu de la présente règle.
  • Wikipédia est faux de dire qu'un POD ne peut pas avoir des membres de type pointeur vers membre. Ou plutôt, c'est correct pour le C++98 libellé, mais TC1 explicite que des pointeurs vers membre sont POD.

Officiellement (C++03 Standard):

3.9(10): "l'Arithmétique types (3.9.1), l'énumération des types, des types de pointeur, et le pointeur de types de membres (3.9.2) et des cv qualifiés versions de ces types (3.9.3) sont collectivement appelant types scalaires. Types scalaires, POD-struct types, POD-types d'union (article 9), les tableaux de ces types de cv qualifiés versions de ces types (3.9.3) sont collectivement appelés le POD types"

9(4): "UN POD-struct est un agrégat de la classe qui n'a pas de non-données membres statiques de type non-POD-struct, non-POD-union (ou d'une matrice de ce type) ou de référence, et n'a pas l'utilisateur de définir copie de l'opérateur et non défini par l'utilisateur destructeur. De même, un POD-union est un agrégat de l'union qui n'a pas de non-données membres statiques de type non-POD-struct, non-POD-union (ou d'une matrice de ce type) ou de référence, et n'a pas l'utilisateur de définir copie de l'opérateur et non défini par l'utilisateur destructeur.

8.5.1(1): "Un agrégat est un tableau ou une classe (clause 9) sans que l'utilisateur n'déclaré par les constructeurs (12.1), aucun privés ou protégés non-membres de données statiques (clause 11), pas de classes de base (article 10) et pas de fonctions virtuelles (10.3)."

20voto

ugasoft Points 1280

Plain Old Data

bref, c’est toutes les données de builtin tapez (ex : int, char, float, int long, unsigned char, double) et tous les 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 « struct ».

11voto

nabijaczleweli Points 33

Comme je comprends POD (PlainOldData) est juste en données brutes - il n'a pas besoin:

  • être construits,
  • pour être détruit,
  • pour des opérateurs.
  • Et (je suppose) ne doit pas avoir les fonctions / être une fonction.

Comment vérifier si quelque chose est un POD? Ainsi, il est une struct appelé 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)>
  { };
}

(À partir de l'en-tête type_traits)


Référence:

-7voto

littlenag Points 2124

Avec C++, âgé de Plaine de Données ne signifie pas seulement que des choses comme int, char, etc, sont les seuls types utilisés. Plaine les Anciennes Données signifie dans la pratique que vous pouvez prendre une struct memcpy à partir d'un seul emplacement dans la mémoire à une autre et tout fonctionne exactement comme vous le feriez s'attendre (c'est à dire de ne pas exploser). Ce casse si votre classe, ou de toute catégorie de votre classe contient, a un membre qui est un pointeur ou d'une référence ou d'une classe qui a une fonction virtuelle. Essentiellement, si les pointeurs doivent être impliqués quelque part, ce n'est pas de la Plaine des Données Anciennes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X