协慌网

登录 贡献 社区

C ++ 中的 POD 类型是什么?

我有几次遇到这个术语 POD 型。这是什么意思?

答案

POD代表普通旧数据 - 即没有构造函数,析构函数和虚拟成员函数的类(无论是使用关键字struct还是关键字class )。 维基百科关于 POD 的文章更详细,并将其定义为:

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

C ++ 98/03 的答案中可以找到更多细节。 C ++ 11 改变了围绕 POD 的规则,使它们大大放松,因此需要在此处进行后续回答

非正式地:

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

不那么非正式:

  • intcharwchar_tboolfloatdouble是 POD,以及它们的long/short和有signed/unsigned版本。
  • 指针(包括指向函数的指针和指向成员的指针)是 POD,
  • enums是 POD
  • constvolatile POD 是 POD。
  • POD 的classstructunion是 POD,前提是所有非静态数据成员都是public ,并且它没有基类,也没有构造函数,析构函数或虚方法。静态成员不会在此规则下停止某个 POD。此规则在 C ++ 11 中已更改,并且允许某些私有成员: 具有所有私有成员的类是否可以是 POD 类?
  • 维基百科说 POD 不能包含指向成员的类型成员是错误的。或者更确切地说,它对于 C ++ 98 的措辞是正确的,但 TC1 明确指出成员指针是 POD。

形式上(C ++ 03 标准):

3.9(10): “算术类型(3.9.1),枚举类型,指针类型和指向成员类型的指针(3.9.2)以及这些类型的 cv 限定版本(3.9.3)是统一调用者标量类型。标量类型,POD 结构类型,POD 联合类型(第 9 节),这些类型的数组和这些类型的 cv 限定版本(3.9.3)统称为 POD 类型 “

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

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

普通旧数据

简而言之,它是所有内置数据类型(例如intcharfloatlongunsigned chardouble等)以及 POD 数据的所有聚合。是的,这是一个递归定义。 ;)

更清楚一点,POD 就是我们所说的 “结构”:一个单元或一组只存储数据的单元。