Plain Old Data
POD是Plain Old Data的缩写,C++ POD types的对象需要满足两个条件:
- 支持static initialization(不必dynamic initialization)
- 内存布局需要和对应的C struct的内存布局相同
这就意味着POD对象存储在连续的内存区域,并且可以清楚的用对象的地址访问到成员的地址。
1就是trivial types的充要条件,2就是standard-layout types的充要条件,两者合起来就是POD的条件。
Trivial types
具体的Trivial types的定义请看TrivialType。
在我理解上,trivial type保证的是对象的在内存中连续存储,并且可以使用memcpy拷贝对象而不会破坏对象,但是不能保证内存中成员是怎样的一个布局。
Trivial type需要满足下面两个条件:
- has a trivial default constructor
- is trivially copyable
trivial default constructor 指:
- 不是用户提供的
- 类没有虚函数和虚基类
- 没有类内初始化
- 类的成员和基类也递归地满足1 2 3
is trivially copyable 指:
- has a trivial copy/move ctor
- has a trivial copy/move assignment operator
- has a trivial destructor
那什么是trivial的copy/move ctor或copy/move assignment operator呢?
- 不是用户提供的
- 类没有虚函数和虚基类
- 类的成员和基类也递归地满足1 2
Aggregate
An aggregate is an array or a class (Clause 9) with no user-provided constructors (12.1), no brace-or-equal-initializers for non-static data members (9.2), no private or protected non-static data members (Clause 11), no base classes (Clause 10), and no virtual functions (10.3).
也就是说,聚合类在trivial class的基础上可以有用户提供的copy ctor, assignment operator,destructor,但是不能有用户提供的非默认的构造函数。
Standard-layout types
具体的Trivial types的定义请看StandardLayoutType。
几个例子
struct N { // neither trivial nor standard-layout
int i;
int j;
virtual ~N();
};
struct T { // trivial but not standard-layout
int i;
private:
int j;
};
struct SL { // standard-layout but not trivial
int i;
int j;
~SL();
};
struct POD { // both trivial and standard-layout
int i;
int j;
};