不小心翻阅到的一段关于POD的资料,总结记录在案

原创 2011年01月17日 04:32:00

什么是POD?这是一个问题.我甚至很难找到2份完全相同的答案.

 

摘自文档ISO/IEC 14882:2003(E) P153:

...A POD-struct is an aggregate class that has no non-static data members of type non-POD-struct,

non-POD-union (or array of such types) or reference, and has no user-defined copy assignment operator

and no user-defined destructor. Similarly, a POD-union is an aggregate union that has no non-static data

members of type non-POD-struct, non-POD-union (or array of such types) or reference, and has no user-

defined copy assignment operator and no user-defined destructor. A POD class is a class that is either a

POD-struct or a POD-union.

(我连换行什么的格式都一并拷贝了下来)

 

然而我们的wiki百科在上述这段话的背后又加注了一下面段话,让我更疑惑了.注意我上面贴的那段话也几乎出现在维基中的这段话前面,我说几乎,是个别措辞有些区别并且没有提union,但是意思可以说是不多不少,恰好等价.

http://en.wikipedia.org/wiki/Plain_Old_Data_Structures

(A POD type in C++ is defined as either a scalar type or a POD class. A POD class has no user-defined copy assignment operator, no user-defined destructor, and no non-static data members that are not themselves PODs.)Moreover, a POD class must be an aggregate, meaning it has no user-declared constructors, no private nor protected non-static data, no bases and no virtual functions.

 

这个Moreover(我觉得该Morever的)就彻底让我糊涂了:这是维基志愿编辑者画蛇添足呢,还是真的在ISO文档中确实有这段话,我自己没有找到.因为第一段话我也仅仅是在一个介绍Class的角落中无意找到了,从编撰的格式上来说不像正式定义, 措辞上也仅仅用了"that" 这样的描述性词汇,似乎是在描述其部分特性而不是严格的对其进行定义.

 

不过可以肯定的是,在我们通常用的编译器中,有虚函数的肯定不是POD.这一点让我有些怀疑POD是一个实现定义的标准,标准仅仅给出了其最小要求,然后具体的各个编译器根据其对象模型还各自加了一些要求.

 

我们不能否定可能存在某个编译器,在其虚函数的实现模型中没有在对象中插入数据,也使得其构造过程不需要设置虚表指针之类的( 全局表?). 也不能排除某个编译器可以做出超牛的inline优化, 让构造函数的执行隐藏在了某些C语言标准中的未定义行为中(纯属笔者臆想哈).不然我也实在没法给个理由让自己相信:需要初始化才能用的对象居然还是POD?

 

我见过的最常见的POD要求是(个人总结):

1.ISO标准中的要求.

2.没有虚函数和自定义的任何构造函数. ISO标准只禁止了重载operator "="和析构函数.

3.没有基类.

4.没有非静态的常量和引用类型成员. 这2个玩意儿没有自定义构造函数没法初始化.

5.无虚函数和自定义的任何构造函数的空类是非POD, 继承空类不会影响子类是否是POD的判断. 空类被打成非POD我怀疑仅是为了允许参数传递和返回值优化.

 

C++ 0x标准草案最新POD定义(好像已经投票通过了):

 

http://en.wikipedia.org/wiki/C%2B%2B0x

 

A class/struct is considered a POD if it is trivialstandard-layout, and if all of its non-static members are PODs.

A trivial class or struct is defined as one that:

  1. Has a trivial default constructor. This may use the default constructor syntax (SomeConstructor() = default;).
  2. Has a trivial copy constructor, which may use the default syntax.
  3. Has a trivial copy assignment operator, which may use the default syntax.
  4. Has a trivial destructor, which must not be virtual.

A standard-layout class or struct is defined as one that:

  1. Has only non-static data members that are of standard-layout type
  2. Has the same access control (public, private, protected) for all non-static data members
  3. Has no virtual functions
  4. Has no virtual base classes
  5. Has only base classes that are of standard-layout type
  6. Has no base classes of the same type as the first defined non-static data member
  7. Either has no base classes with non-static data members, or has no non-static data members in the most derived class and at most one base class with non-static data members. In essence, there may be only one class in this class's hierarchy that has non-static data members.

 

中文版:

当class/struct是极简的(trivial)、属于标准布局(standard-layout),以及他的所有非静态(non-static)成员都是POD时,会被视为POD。

一个极简的类或结构符合以下定义:

  1. 极简的默认建构式。这可以使用默认建构式语法,例如SomeConstructor() = default;
  2. 极简的复制建构式,可使用默认语法(default syntax)
  3. 极简的赋值操作符,可使用默认语法(default syntax)
  4. 极简的解构式,不可以是虚拟的(virtual)

一个标准布局(standard-layout)的类或结构符合以下定义:

  1. 只有非静态的(non-static)数据成员,且这些成员也是符合标准布局的类型
  2. 对所有non-static成员有相同的访问控制(public, private, protected)
  3. 没有虚函数
  4. 没有虚拟基类
  5. 只有符合标准布局的基类
  6. 没有和第一个定义的non-static成员相同类型的基类
  7. 若非没有带有non-static成员的基类,就是最底层(继承最末位)的类没有non-static数据成员而且至多一个带有non-static成员的基类。基本上,在该类的继承体系中只会有一个类带有non-static成员
 个人观点, 仅供参考. 欢迎达人指点.
------------------------------------------------补正----------------------------------------------------------------

...A POD-struct is an aggregate class that:经过高人指点,标准中这句话的"that"使用不当,应当替换为"and"!

也就是说后面的从句不是解释aggregate 而是 what's more的意思!

 

aggregate 的定义:An aggregate class is a class with no user-declared constructors, no private or protected non-static data members, no base classes, and no virtual functions。

人工智能资料整理总结

这里收集的是关于人工智能(AI)的教程、书籍、视频演讲和论文。 欢迎提供更多的信息。 在线教程 麻省理工学院人工智能视频教程 – 麻省理工人工智能课程 人工智能入门 – 人工智能基...
  • BaiHuaXiu123
  • BaiHuaXiu123
  • 2016年09月09日 13:10
  • 3052

人脸识别资料

人脸识别资料之前在树莓派上用opencv做人脸识别的资料
  • scylhy
  • scylhy
  • 2017年04月15日 17:13
  • 1361

隐马尔可夫模型(HMM)简单总结

HMM是生成式模型,属于动态贝叶斯网络。 HMM是一个五元组 S表示状态值集合 O表示观测值集合 π表示状态值对应的概率 A表示状态转移矩阵 B表示发射矩阵 1、评估问题 已知:S O...
  • x18835129278
  • x18835129278
  • 2018年01月22日 20:27
  • 8

git 学习资料和最佳实践的文章

git 最佳实践的文章:少用 pull http://www.cnblogs.com/flying_bat/p/3408634.html
  • lw_power
  • lw_power
  • 2015年07月16日 17:09
  • 449

有关杨辉三角的资料

二项式定理公开课教案(第一教时)                             执教:卢明   2002年4月30日一、教学目标1、理解杨辉三角形。其行为样例是:(1)能用不完全归纳法写出杨...
  • ck4918
  • ck4918
  • 2006年06月19日 10:24
  • 1946

Django资料总结

一,完整框架django开发的社区和博客Github https://github.com/BeginMan/codetheme blog http://www.cnblogs.com/BeginM...
  • SVALBARDKSY
  • SVALBARDKSY
  • 2016年02月19日 12:41
  • 1005

MapReduce总结 (1)

【1】Hadoop Map/Reduce框架为每一个InputSplit产生一个map任务,而每个InputSplit是由该作业的InputFormat产生的。 【2】Mapper的输出被排...
  • zzh118
  • zzh118
  • 2016年04月07日 21:53
  • 346

OpenStack之学习资料

网上关于OpenStack的学习资料有很多,官网的doc文档也是很好的资料,还有一些牛人的技术博客,在此列举一些学习的资料。 IBM http://www.ibm.com/developerworks...
  • henulwj
  • henulwj
  • 2015年08月30日 10:40
  • 1263

Kubernetes之Pod调度

【编者的话】Kubernetes调度器根据特定的算法与策略将pod调度到工作节点上。在默认情况下,Kubernetes调度器可以满足绝大多数需求,例如调度pod到资源充足的节点上运行,或调度pod分散...
  • qq_32261399
  • qq_32261399
  • 2017年09月08日 10:15
  • 514

cocoapods search 获取不到最新库的解决方法

获取不到最新库的原因主要有两个:1.cocoapods的版本过低 2.还没有更新本地仓库解决方法: 1.更新pods在终端执行命令行 sudo gem install cocoapods有时候会...
  • Jayant_Y
  • Jayant_Y
  • 2016年12月07日 14:34
  • 2408
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:不小心翻阅到的一段关于POD的资料,总结记录在案
举报原因:
原因补充:

(最多只允许输入30个字)