企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 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》](http://www.cnblogs.com/tingshuo/archive/2013/03/28/2986236.html)) 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)](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2294.html) . (翻译:张潇)