Plain Old Data,通常用于说明一个类型的属性,尤其是用户自定义类型。C++11将POD划分为两个概念的合集trivial和standad layout。
POD意义:
1、字节赋值:我们可以安全地使用memset和memcpy对POD类型进行初始化和拷贝等操作;
2、提供对C的内存布局兼容:POD类型的数据在C和C++间的操作总是安全的;
3、保证静态初始化的安全有效:静态初始化很多时候可以提高程序的性能,而POD类型的对象初始化往往更简单。
trivial:
1、拥有普通的默认构造函数,可以通过使用默认构造函数语义实现(=default);
通常情况下,如果不定义类的构造函数,编译器会默认自动生成一个trivial默认构造函数;但是一旦我们定义了一个构造函数,即使它不包含参数,且函数体里没有代码,该构造函数也不再是trivial。
如:
class NoTrivial{
NoTrivial();
}
2、拥有普通的copy和move构造函数,同样可以使用(=default);
trivial copy构造函数等同于使用memcpy进行构造,若不声明,则编译器会自动生成一个trivial copy构造函数,move同理。
3、拥有普通的copy赋值运算符和move赋值运算符,可以使用(=default);
4、拥有普通的析构函数,非virtual;
在C++11中可以利用一些辅助的类模板进行属性判断:
template<typename T> struct std::is_trivial;
is_trivial<classname>::value;//value=1,代表trivial;0反之。
standard layout:
1、没有虚函数;
2、没有虚基类;
3、所有非静态成员(non-static)具有相同的访问权限;(public、protect or private)
4、派生类中具有非静态成员,且只有一个仅包含静态成员的基类;
5、基类有非静态成员,而派生类无非静态成员;
6、派生类中第一个非静态成员与其基类类型不同;
---------如果一个类是POD,则其所有非静态成员和基类都是POD.
在C++11中可以利用一些辅助的类模板进行属性判断:
template<typename T> struct std::is_standard_layout;
is_standard_layout<classname>::value;//value=1,代表standard_layout;0反之。
如果要判断一个类型是不是POD,标准库<type_traits>也提供了如下模板:
template<typename T> struct std::is_pod;
is_pod<classname>::value;//value=1,代表pod;0反之。