Plain Old Data

POD,全称plain old data,plain代表它是一个普通类型,old代表它可以与c兼容,可以使用比如memcpy()这类c中最原始函数进行操作。C++11中把POD分为了两个基本概念的集合,即:平凡的(trival)和标准布局的(standard layout)。

trival:通常一个trival的类或者结构体需要满足以下定义,拥有平凡的默认构造函数和析构函数。

默认的意思就是由编译器为我们自动生成的,不许是我们自己定义的,但是由于c++11提供了default,也可以是自己定义的加=default,比如

struct Trival
{
    Trival(){}=default;
}

就是满足这个要求的,而

struct noTrival
{
    noTrival(){};
}

就不满足这个要求(哪怕我们定义的构造函数体里面啥都没有)。这个要求对于带参的构造函数没有束缚。你可以自定义带参的构造函数。

  • 拥有平凡的拷贝构造函数和移动构造函数。默认的意思同上,也可以使用=default。
  • 拥有平凡的拷贝赋值操作符和移动赋值操作符。
  • 不能包含虚函数和虚基类。

standard-layout

  • 所有非静态成员拥有相同的访问级别,(访问级别就是public,private,protected)
  • 在类和结构体继承时需要满足以下两个情况之一:

    1、派生类中有非静态类,那么这个派生类只能有且只有一个仅包含了静态成员的基类。
    2、基类有非静态成员,那么派生类中不允许有非静态成员。
    
  • 类中第一个非静态类型与基类不是同一个类型
  • 没有虚类和虚基类
  • 所有非静态数据成员都符合标准布局的要求,这其实就是一个递归的定义。

C++11中,POD就是满足trivalstandard-layout这两个方面。可以使用中的is_pod::value判断T是不是POD类型的。

为什么需要POD这种条件满足的数据呢?

  • 可以使用字节赋值,比如memset,memcpy操作
  • 对C内存布局兼容。
  • 保证了静态初始化的安全有效。