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构造函数语法)。
参考文献:
- the C++ draft section 3.9 and 9 [10]
[N2294=07-0154] Beman Dawes:
POD’s Revisited; Resolving Core Issue 568 (Revision 4)
.
(翻译:张潇)