返回介绍

POD

发布于 2025-02-26 23:19:58 字数 1483 浏览 0 评论 0 收藏 0

所谓 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 构造函数语法)。

参考文献:

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文