POD

所谓POD(Plain Old Data),指的是那些可以像C结构体一样直接操作的“普通”类型,对于该种类型,可以直接对它用memset()/memcpy()来进行初始化/拷贝等操作。

在C++98标准中,POD实际上是受限于结构体定义时所涉之语言特性而定义的。

struct S { int a; };    // S属于POD
struct SS { int a; SS(int aa) : a(aa) { } }; // SS不属于POD
struct SSS { virtual void f(); /* ... */ };

在C++11中,S和SS都是“标准布局类型”(即POD),因为SS实在没什么复杂的地方:构造函数不会影响它内存布局(所以memcpy()也能用),不过这里却不能用memset()来初始化——因为它可能违反构造函数中定义的赋值规则(需要用aa来为a赋值)。另外,这里的SSS则明显不是POD了,因为其每个对象中都包含着虚表指针(vptr)。

C++11中引进或重新定义了POD、trivially-copyable类型、trivial类型、以及”标准布局”类型等概念,以用来处理C++98中原”POD”相关的一系列技术问题。

(译注:请参阅《怎样理解C++ 11中的trivial和standard-layout—An answer from stackoverflow》

POD的(递归)定义如下:

  • 所有的成员类型和基类都是POD类型
  • 其余部分跟以前一样(参见[10]第9章节)

不含虚函数

不含虚基类

不含引用

不含多种访问权限(译注:对所有non-static成员有相同的public/private/protected访问控制权限)

C++11中关于POD方面最重要的部分就是POD中允许存在不影响内存布局和性能的构造函数(译注:参见C++11中新引入的default构造函数语法)。

参考文献:

(翻译:张潇)