认识POD
POD全称Plain Old Data,P属性表示这个类型是个平凡的类型。C++11中将POD划分为两个基本概念:平凡的(trival)和标准布局(standardlayout)。
平凡性
具备一下4个特征
- 具有平凡的默认构造函数
- 具有平凡的拷贝构造函数和移动构造函数。
- 具有平凡的拷贝赋值运算符和移动赋值运算符
- 不包含虚函数和虚基类
C++11提供了一个类模板来帮我们识别一个类是否是平凡的:
template <typename T>struct std::is_trival
标准布局
满足以下条件的类和结构体是标准布局
- 所有非静态成员有相同的访问权限
- 派生类有非静态成员,且只有一个仅包含静态成员的基类
- 基类有非静态成员,而派生类没有非静态成员
- 类的第一个非静态成员类型与基类不同
- 没有虚函数和虚基类
- 所有非静态成员都符合标准布局类型,父类也符合标准布局
C++11提供了如下模板来判断一个类或结构体对象是否是标准布局
template <typename T> structstd::is_standard_layout; //头文件为<type_traits>
template <typename T> struct std::is_pod //判断一个类型是否是POD,头文件为<type_traits>
POD的好处:
-
字节赋值,我们可以放心的使用memset和memcpy对POD类型进行初始化和拷贝。
-
提供对C内存的兼容。POD类型的数据在C与C++间的操作总是安全的。
-
保证了静态初始化的安全有效。POD类型的对象初始化往往更简单