POD C++

Plain Old Data https://zh.cppreference.com/w/cpp/named_req/PODType

简言之,针对POD对象,其二进制内容是可以随便复制的,在任何地方,只要其二进制内容在,就能还原出正确无误的POD对象。对于任何POD对象,都可以使用memset()函数或者其他类似的内存初始化函数。

这表示该类型与用于 C 程序语言的类型兼容,即能直接以其二进制形式与 C 库交互。

注意:标准中并没有定义具有这个名字的具名要求。这是核心语言所定义的一种类型类别。将它作为具名要求包含于此只是为了保持一致性。

此类型要求在 C++ 标准中已弃用。其所有使用都已被替换成更为斟酌过的类型要求,例如平凡类型 (TrivialType) (C++20 起)

要求

以下之一:

  • 标量类型
  • 满足下列要求的类类型(class 或 struct 或 union):
  • 聚合类型
  • 没有非 POD 的非静态成员;
  • 没有引用类型的成员;
  • 没有用户定义的复制构造函数;
  • 没有用户定义的析构函数
(C++11 前)

(C++11 起)

  • 这种类型的数组

----------------------------------------------------------------------------------------

什么是 平凡类型

要求

什么是 可平凡复制

要求

  • 每个复制构造函数均为平凡或弃置的
  • 每个移动构造函数均为平凡或弃置的
  • 每个复制赋值运算符均为平凡或弃置的
  • 每个移动赋值运算符均为平凡或弃置的
  • 至少一个复制构造函数、移动构造函数、复制赋值运算符或移动赋值运算符未弃置
  • 平凡而未弃置的析构函数

这意味着该类没有虚函数虚基类

标量类型和可平凡复制 (TriviallyCopyable) 对象的数组也是可平凡复制 (TriviallyCopyable) 的。

什么是 标准布局类型(StandardLayoutType)

指定一个类型为标准布局类型。标准布局类型适用于与其他语言编写的代码交流

要求

  • 所有非静态数据成员必须具有相同的访问控制
  • 没有虚函数或虚基类
  • 没有引用类型的非静态数据成员
  • 所有非静态数据成员和基类自身也是标准布局类型
  • 满足以下之一
  • 没有带有非静态数据成员的基类,或
  • 最终派生类中没有非静态数据成员,且至多有一个基类拥有非静态数据成员
  • 没有与首个非静态数据成员类型相同的基类(见空基类优化
(C++14 前)
  • 不存在两个相同类型的(可能间接的)基类子对象
struct Q {};
struct S : Q { };
struct T : Q { };
struct U : S, T { }; // 并非标准布局类:有两个 Q 类型的基类子对象
  • 所有非静态数据成员和位域都在同一类中声明(要么全在派生类中,要么全在某个基类中)
struct B { int i; };         // 标准布局类
struct C : B { };            // 标准布局类
struct D : C { };            // 标准布局类
struct E : D { char : 4; };  // 非标准布局类
  • 不存在与如下各项具有相同类型的基类子对象
  • 对于非联合类型,为其首个非静态数据成员(见空基类优化),递归地,若该数据成员具有非联合类类型,则为其首个数据成员,或者若该数据成员为联合体类型,则为其所有非静态数据成员,或者若该数据成员为数组类型,则为其元素类型,依此递归。
  • 对于联合体类型,为其任何非静态数据成员,递归地,若该数据成员具有非联合类类型,则为其首个数据成员,或者若该数据成员为联合体类型,则为其所有非静态数据成员,或者若该数据成员为数组类型,则为其元素类型,依此递归。
  • 对于数组类型,为数组元素的类型,递归地,若该数据成员拥有非联合类类型,则为其首个数据成员,或者若该数据成员为联合体类型,则为其所有非静态数据成员,或者若该数据成员为数组类型,则为其元素类型,依此递归。
原文地址:https://www.cnblogs.com/redips-l/p/12298599.html