美文网首页
C++ POD types

C++ POD types

作者: 先点菜吧 | 来源:发表于2019-01-08 09:10 被阅读0次

Plain Old Data

POD是Plain Old Data的缩写,C++ POD types的对象需要满足两个条件:

  1. 支持static initialization(不必dynamic initialization)
  2. 内存布局需要和对应的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. 没有类内初始化
  4. 类的成员和基类也递归地满足1 2 3

is trivially copyable 指:

  1. has a trivial copy/move ctor
  2. has a trivial copy/move assignment operator
  3. has a trivial destructor

那什么是trivial的copy/move ctor或copy/move assignment operator呢?

  1. 不是用户提供的
  2. 类没有虚函数和虚基类
  3. 类的成员和基类也递归地满足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;
};

Reference

相关文章

网友评论

      本文标题:C++ POD types

      本文链接:https://www.haomeiwen.com/subject/dpfhxqtx.html