511 votos

¿Qué son los POD de tipos en C++?

Me he encontrado con este término POD-tipo un par de veces... ¿qué significa?

352voto

Greg Hewgill Puntos 356191

POD significa para el Viejo y simple de los Datos , es decir, un struct (o class) sin constructores, destructores virtuales y los miembros de las funciones. Wikipedia artículo sobre la VAINA va en un poco más de detalle y la define como:

Un Viejo y simple de la Estructura de Datos en C++ es un agregado de la clase que contiene sólo las VAINAS como miembros, no tiene definida por el usuario destructor, no definida por el usuario de la copia de operador de asignación, y no estático miembros de puntero a miembro tipo.

Mayor detalle se pueden encontrar en esta respuesta para C++98/03. C++11 cambiado las reglas en torno a los POD, relajarse en gran medida, lo que exige un seguimiento de la respuesta aquí.

224voto

Steve Jessop Puntos 166970

Muy informalmente:

Una VAINA es un tipo (incluidas las clases donde el compilador de C++ garantiza que no hay "magia" en la estructura: por ejemplo ocultos punteros a vtables, los desplazamientos que se aplican a la dirección cuando se convierte a otros tipos (al menos si el objetivo de la VAINA), constructores o destructores. Resumiendo, un tipo es una VAINA cuando las únicas cosas que en ella están integrados en los tipos y combinaciones de ellos. El resultado es algo que "actúa como una" C tipo.

Menos informalmente:

  • int, char, wchar_t, bool, float, double son las Vainas, como son a largo/corto y signed/unsigned versiones de ellos.
  • punteros (incluyendo puntero a función y de puntero a miembro) son las Vainas,
  • las enumeraciones son Vainas
  • una constante o volátiles POD es una VAINA.
  • una clase, estructura o unión de las Vainas es una VAINA, siempre que todos los no-miembros de datos estáticos son públicos, y no tiene ninguna clase de base y no constructores, destructores, o a los métodos virtuales. Los miembros estáticos no deje de algo que es un POD bajo esta regla.
  • La Wikipedia está mal decir que un grupo no tiene miembros de tipo puntero a miembro. O más bien, es correcto para el C++98 redacción, pero TC1 explícito de que los punteros a miembro de la VAINA.

Formalmente (C++03 Estándar):

3.9(10): "la Aritmética de los tipos (3.9.1), los tipos de enumeración, los tipos de puntero, y el puntero para los tipos de miembros (3.9.2) y la cv-versiones completas de estos tipos (3.9.3) son colectivamente llamador tipos escalares. Tipos escalares, POD-struct tipos, POD-tipos de unión (cláusula 9), las matrices de los tipos y la cv-versiones completas de estos tipos (3.9.3) son llamados colectivamente POD tipos"

9(4): "UNA VAINA-struct es un agregado de la clase que no tiene ningún no-miembros de datos estáticos de tipo no-POD-struct, no POD-unión (o de la matriz de tales tipos) o una referencia, y no tiene definidos por el usuario de la copia del operador y el usuario no definido por el destructor. De igual manera, el POD-union es un agregado de la unión que no tiene ningún no-miembros de datos estáticos de tipo no-POD-struct, no POD-unión (o de la matriz de tales tipos) o una referencia, y no tiene definidos por el usuario de la copia del operador y el usuario no definido por el destructor.

8.5.1(1): "Un conjunto es una matriz o una clase (cláusula 9) con la que el usuario no declarado de constructores (12.1), no private o protected los no-miembros de datos estáticos (cláusula 11), no hay clases base (cláusula 10) y ninguna de las funciones virtuales (10.3)."

10voto

ugasoft Puntos 1280

El Viejo Y Simple De Datos

en resumen es todo builtin tipo de datos (por ejemplo: int, char, float, long int, unsigned char, double) y todos los de la agregación de la VAINA de datos. Sí, es una definición recursiva ;)

Para ser más claros, una VAINA es a lo que llamamos 'struct'.

4voto

nabijaczleweli Puntos 33

Como yo lo entiendo POD (PlainOldData) es sólo un sistema de datos - no se necesita ser:

  • para ser construido,
  • para ser destruidos,
  • para tener personalizado a los operadores de.
  • Y (supongo) no debe tener funciones / una función.

Cómo comprobar si algo es una VAINA? Bien, no es una estructura para que los llamados 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 encabezado type_traits)


Referencia:

-4voto

littlenag Puntos 2124

Con C++, el Viejo y simple de Datos no sólo significa que cosas como int, char, etc son los únicos tipos que se utilizan. El Viejo y simple de los Datos que realmente significa en la práctica que usted puede tomar un struct memcpy de un lugar en la memoria a otro y que las cosas funcionan exactamente como sería de esperar (es decir. no volar). De esta forma se rompe si su clase, o de cualquier clase su clase contiene, tiene como miembro que es de un puntero o una referencia o una clase que tiene una función virtual. Esencialmente, si los punteros tienen que estar involucrados en algún lugar, no es el Viejo y simple de los Datos.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X