跳转到内容

POD (程序设计)

维基百科,自由的百科全书

这是本页的一个历史版本,由Cwek留言 | 贡献2012年4月15日 (日) 03:58 (添加 {{multiple issues}}带有参数citation style、prose、tone和wikify标记到条目 (TW))编辑。这可能和当前版本存在着巨大的差异。

Plain old data structure, 缩写为POD, 是C++语言的标准中定义的一类数据结构[1],主要用于C++与C语言的数据结构对象的兼容目的。

定义

POD类型包括下述C++类型,以及其cv-qualified的类型,还有以其为基类型的数组类型[2]:

  • 标量类型(scalar type)
  • POD类类型(POD class type)

标量类型

术语标量类型包括下述C++类型范畴, 以及其cv-qualified类型[3]:

  • 算术类型(arithmetic type)
  • 枚举类型(enumeration type)
  • 指针类型(pointer type)
  • 指针到成员类型(pointer-to-member type)

术语算术类型包括下述C++类型范畴[4]:

  • 整数类型(integral type)
  • 浮点类型(floating type)

术语整数类型包括下述C++类型范畴[5]:

  • 有符号整数类型 (signed char, short, int, long),
  • 无符号整数类型(unsigned char, unsigned short, unsigned int, unsigned long),
  • 字符类型char与宽字符类型wchar_t
  • 布尔类型bool.

术语浮点类型包括C++的float, double, and long double类型[6].

术语枚举类型包括各种枚举类型,即命名的常量值(named constant values)的集合[7].

术语指针类型包括下述C++类型范畴[8]:

  • 空指针pointer-to-void (void *),
  • 对象指针pointer-to-object与指向静态数据成员的指针pointer-to-static-member-data (都是形如为T*,其中T是对象类型),
  • 函数指针pointer-to-function与指向静态成员函数的指针pointer-to-static-member-function (都是形如T (*)(...),T是函数的返回值的类型).

术语指针到成员类型包括下述C++类型范畴[9]:

  • 指针到非静态数据成员(pointer-to-nonstatic-member-data), 形如T C::* 表示指向类C的类型为T的数据成员的指针;
  • 指针到非静态成员函数(pointer-to-nonstatic-member-functions), 形如T (C::*)(...) 表示指向类C的返回值类型为T的成员函数的指针.

POD类类型

POD类类型是指聚合类(aggregate classes, 即POD-struct types)与聚合union (POD-union types),且不具有下述成员[10]:

  • 指针到成员类型的非静态数据成员(包括数组)
  • 非POD类类型的非静态数据成员(包括数组)
  • 引用类型的(reference type)非静态数据成员,
  • 用户定义的拷贝与赋值算子
  • 用户定义的析构函数.

术语聚合是指任何的数组或者类,且不具有下述特征[11]:

  • 用户定义的构造函数
  • 私有或保护的非静态数据成员
  • 基类
  • 虚函数.

可见,POD类类型就是指class、struct、union,且不具有用户定义的构造函数、析构函数、拷贝算子、赋值算子;不具有继承关系,因此没有基类;不具有虚函数,所以就没有虚表;非静态数据成员没有私有或保护属性的、没有引用类型的、没有非POD类类型的(即嵌套类都必须是POD)、没有指针到成员类型的(因为这个类型内含了this指针)。

用途

POD类型在源代码兼容于ANSI C时非常重要。POD对象与C语言的对应对象具有共同的一些特性,包括初始化、复制、内存布局、寻址。

一个例子是下述C++的new表达式中的对象初始化,POD与non-POD的区别[12]:

表达式 POD类型T non-POD类型T
new T 不初始化 缺省初始化
new T() 总是缺省初始化
new T(x) 总是调用构造函数初始化

因此,non-POD类型的对象或数组总是被初始化;而POD类型的对象或数组可能未被初始化.

其它与POD相关的C++特性:

  • 内存布局——POD对象的组成字节是连续的[13].

"POD-struct ... types are layout-compatible if they have the same number of members, and corresponding members (in order) have layout-compatible types"[14].

POD-union ... types are layout-compatible if they have the same number of members, and corresponding members (in any order) have layout-compatible types"[15].

  • 初始化——对于non-const POD对象,如果没有初始化声明时,具有不确定的初值(indeterminate initial value) [16]. POD对象的缺省初始化为0值[17]. 静态POD对象初始化为给定的初值,如果是局部静态POD对象,在进入所在作用域之前初始化[18][§6.7, ¶4]; 对于非局部静态POD对象,在任何动态初始化之前赋予初值[19].
  • 拷贝——POD对象可直接拷贝(例如用memcpy())到其它字符数组或相同POD类型的对象,保持其值不变[20]。POD类型可以用作标准模板字符串类的字符[21]. 由于这个原因,函数的返回值如果是non-POD类型,则不能通过寄存器传递函数的返回值。
  • 寻址——一个POD对象的地址可以是一个地址常量表达式[22];一个对POD成员的引用可以是一个引用常量表达式[23]. 一个POD-struct对象的指针,适合用reinterpret_cast转换到它的初始值[24].

参见

Visual C++名字修饰

参考文献

  1. ^ ISO/IEC 14882, first edition, 1998-09-01 p. 5, footnote 4]
  2. ^ 参见C++标准的§3.9, ¶10; §9, ¶4
  3. ^ 参见C++标准§3.9, ¶10
  4. ^ 参见C++标准§3.9.1, ¶8
  5. ^ 参见C++标准§3.9.1, ¶7
  6. ^ 参见C++标准§3.9.1, ¶8
  7. ^ 参见C++标准§3.9.1, ¶1; §7.2, ¶1
  8. ^ 参见C++标准§3.9.2, ¶1
  9. ^ 参见C++标准§3.9.2, ¶1
  10. ^ 参见C++标准§9, ¶4
  11. ^ 参见C++标准§8.5.1, ¶1
  12. ^ 参见C++标准§5.3.4, ¶15
  13. ^ 参见C++标准§1.8, ¶5
  14. ^ 参见C++标准§9.2, ¶14
  15. ^ 参见C++标准§9.2, ¶15
  16. ^ 参见C++标准§8.5, ¶9
  17. ^ 参见C++标准§8.5, ¶5
  18. ^ 参见C++标准§6.7, ¶4
  19. ^ 参见C++标准§3.6.2, ¶1
  20. ^ 参见C++标准§3.9, ¶2与3
  21. ^ 参见C++标准§21, ¶1
  22. ^ 参见C++标准§5.19, ¶4
  23. ^ 参见C++标准§5.19, ¶5
  24. ^ 参见C++标准§9.2, ¶17