C ++中的PODtypes是什么?

我遇到过这个PODtypes的几次…这是什么意思?

POD代表简单的旧数据 – 也就是说,一个类(无论是关键字struct或关键字class )没有构造函数,析构函数和虚拟成员函数。 维基百科有关POD的文章更详细一些,并将其定义为:

C ++中的普通旧数据结构是一个聚集类,它只包含PODS成员,没有用户定义的析构函数,没有用户定义的复制赋值操作符,也没有指向成员types的非静态成员。

在C ++ 98/03的这个答案中可以find更多的细节。 C ++ 11改变了POD的规则,大大放松了他们,因此在这里需要一个后续的答案 。

非常非正式的:

POD是一种types(包括类),其中C ++编译器保证结构中不会有“魔术”:例如隐藏的指向vtable的指针,当它被转换为其他types时被应用到地址的偏移量至less如果目标的POD也是如此),构造函数或析构函数。 粗略地说,一个types是一个POD,当它唯一的东西是内置types和它们的组合。 结果是“行为像”一个Ctypes的东西。

不那么非正式:

  • intcharwchar_tboolfloatdouble是POD, long/short以及它们的有signed/unsigned版本。
  • 指针(包括指向函数的指针和指向成员的指针)都是POD,
  • enums是POD
  • constvolatile POD是POD。
  • POD的classstructunion是POD,只要所有非静态数据成员都是public ,并且没有基类,也没有构造函数,析构函数或虚方法。 在这个规则下,静态成员不会阻止POD。
  • 维基百科错误地说POD不能有指向成员types的成员。 或者说,C ++ 98的写法是正确的,但TC1明确指出,指向成员的是POD。

正式(C ++ 03标准):

3.9(10): “算术types(3.9.1),枚举types,指针types,指向成员types的指针(3.9.2)和这些types的cv限定版本(3.9.3)共同是调用者标量types。types,POD结构types,POD-uniontypes(第9章),这些types的数组和这些types的cv-qualified版本(3.9.3)统称为PODtypes“

9(4): “POD-struct是一个聚合类,它没有types非POD-struct,非POD-union(或这种types的数组)或非引用的非静态数据成员,定义复制操作符并且没有用户定义的析构函数类似地,POD-union是没有types非POD-struct,非POD-union(或这样的types的数组)或引用的非静态数据成员的聚合联合,并没有用户定义的复制操作符,也没有用户定义的析构函数。

8.5.1(1): “聚合是没有用户声明的构造函数(12.1),没有私有或受保护的非静态数据成员(第11节),没有基类(第10节)的数组或类并没有虚拟function(10.3)“。

普通旧数据

简而言之,它是所有内置数据types(例如:int,char,float,long int,unsigned char,double)以及所有POD数据的聚合。 是的,这是一个recursion定义;)

更清楚的是,POD就是我们所说的“结构”。

据我所知POD(PlainOldData)只是一个原始数据 – 它不需要:

  • 待build,
  • 被销毁,
  • 有自定义的运营商。
  • 不得有虚拟function,
  • 并且不得重写操作符。

如何检查是否是POD? 那么,有一个称为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)> { }; } 

(来自标题type_traits)

参考:

POD(普通旧数据)对象具有这些数据types之一 – 基本types,指针,联合,结构,数组或类 – 没有构造函数。 相反,非POD对象是存在构造函数的对象。 POD对象在获取其types的合适大小的存储时开始其生命周期,并且当对象的存储被重用或释放时,其生命周期结束。

PlainOldDatatypes也不能有:

  • 虚拟function(自己的或inheritance的)
  • 虚拟基类(直接或间接)。

PlainOldData的松散定义包括带有构造函数的对象; 但排除那些虚拟的东西。 PlainOldDatatypes的重要问题是它们是非多态的。 inheritance可以使用PODtypes来完成,但是只能用于ImplementationInheritance(代码重用)而不是多态/子types。

普通的(虽然不是严格正确的)定义是PlainOldDatatypes是没有VeeTable的东西。

使用C ++,Plain Old Data并不仅仅意味着像int,char等是唯一使用的types。 普通的旧数据真的意味着在实践中,你可以从内存中的一个位置获取一个结构memcpy到另一个位置,事情就会像你期望的那样工作(即不会爆炸)。 如果你的类或你的类所包含的任何类具有作为指针或引用的成员或者具有虚函数的类,那么这会中断。 本质上,如果指针必须涉及某个地方,它不是简单的旧数据。