Plain Old Data
POD是Plain Old Data的縮寫,C++ POD types的對(duì)象需要滿足兩個(gè)條件:
- 支持static initialization(不必dynamic initialization)
- 內(nèi)存布局需要和對(duì)應(yīng)的C struct的內(nèi)存布局相同
這就意味著POD對(duì)象存儲(chǔ)在連續(xù)的內(nèi)存區(qū)域,并且可以清楚的用對(duì)象的地址訪問到成員的地址。
1就是trivial types的充要條件,2就是standard-layout types的充要條件,兩者合起來就是POD的條件。
Trivial types
具體的Trivial types的定義請(qǐng)看TrivialType。
在我理解上,trivial type保證的是對(duì)象的在內(nèi)存中連續(xù)存儲(chǔ),并且可以使用memcpy拷貝對(duì)象而不會(huì)破壞對(duì)象,但是不能保證內(nèi)存中成員是怎樣的一個(gè)布局。
Trivial type需要滿足下面兩個(gè)條件:
- has a trivial default constructor
- is trivially copyable
trivial default constructor 指:
- 不是用戶提供的
- 類沒有虛函數(shù)和虛基類
- 沒有類內(nèi)初始化
- 類的成員和基類也遞歸地滿足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呢?
- 不是用戶提供的
- 類沒有虛函數(shù)和虛基類
- 類的成員和基類也遞歸地滿足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的基礎(chǔ)上可以有用戶提供的copy ctor, assignment operator,destructor,但是不能有用戶提供的非默認(rèn)的構(gòu)造函數(shù)。
Standard-layout types
具體的Trivial types的定義請(qǐng)看StandardLayoutType。
幾個(gè)例子
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;
};