POD (程序设计)

✍ dations ◷ 2025-08-07 04:39:34 #C++,数据类型

Plain old data structure, 缩写为POD, 是C++语言的标准中定义的一类数据结构,POD适用于需要明确的数据底层操作的系统中。POD通常被用在系统的边界处,即指不同系统之间只能以底层数据的形式进行交互,系统的高层逻辑不能互相兼容。比如当对象的字段值是从外部数据中构建时,系统还没有办法对对象进行语义检查和解释,这时就适用POD来存储数据。

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

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

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

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

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

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

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

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

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

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

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

C++11把情况推广为两种:

类型是平凡的(trivial),则可以静态初始化、可以用memcpy直接复制数据而不是必须用copy构造函数。其生存期始于它的对象的存储被定义,无须等到构造函数完成。平凡class或结构必须满足:

构造函数是平凡的,仅当类没有虚成员函数也没有虚基类。Copy/move运算符是平凡的,仅当没有静态数据成员。

类型是标准布局的(standard-layout)意味着它是有序的并且安排其成员兼容于C语言。这要求满足:

一个class/struct/union是POD,当它是平凡的、标准布局的,所有数据成员是POD.

分为两个概念,对象可以不满足其中一个但是满足另外一个。例如,类有复杂的move与copy构造函数,因此不是平凡的,但可能是标准布局因此能与C程序互操作。类似地,一个类的有public与private的非静态数据成员,因此不是标准布局,但可以是平凡的因此可以memcpy操作。

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

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

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

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

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

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

JAVA中,一些开发者认为POD类型是符合没有public成员且没有方法的类,比如data transfer object。其实不使用事件句柄并且不实现除getter和setter之外的附加方法的POJO(只含有getter和setter的类)和JAVA Bean也属于POD。但不管怎么样,POJO和JAVA Bean已经有了封装,已经违反了POD的定义了。

Visual C++名字修饰

相关

  • 前-mRNA/不均一核RNA前信使RNA(英语:Precursor mRNA,简称为前mRNA、mRNA前体)是一种未成熟的单链信使核糖核酸(mRNA)。前mRNA是从细胞核中的DNA模板通过转录而合成的。前mRNA构成了不均一核RNA(或称为
  • 官吏官吏指中国历史上古代的官员,一般由吏部统一掌控其升迁、任免、考核。现代也时称公务员为官吏。官吏可分为官员以及吏员。官员是领有公家给予的薪水。吏员是官员另外聘用的临
  • 树火纪念纸博物馆树火纪念纸博物馆(英语:Suho Paper Memorial Museum,简称树火纸博、纸博)位于台湾台北市中山区,占地160坪,由财团法人树火纪念纸文化基金会(英语:Suho Memorial Paper Culture Found
  • 异性恋-同性恋统一体性取向连续体(Heterosexual–homosexual continuum)是对人类性行为的心理和哲学理解,将性取向视为从同性恋到异性恋的连续光谱上。这一概念开始于阿尔弗雷德·金赛在1940年代进
  • 金融工程学金融工程学侧重于衍生金融产品的定价和实际运用,它最关心的是如何利用创新金融工具,来更有效地分配和再分配个体所面临的形形色色的经济风险,以优化它们的风险-收益特征。较为
  • 多尔登峰坐标:46°28′07″N 7°44′06″E / 46.46861°N 7.73500°E / 46.46861; 7.73500多尔登峰(Doldenhorn),是瑞士的山峰,位于该国南部,由伯恩州负责管辖,属于伯尔尼兹阿尔卑斯山脉的
  • 杰玛·比兹沃斯杰玛·比兹沃斯(英语:Gemma Beadsworth,1987年7月17日-),出生于西澳大利亚州的首府珀斯,澳大利亚女子水球运动员,司职中锋。她亦是澳大利亚国家女子水球队的成员,曾代表国家参加2008
  • 亚历山大二世 (苏格兰)亚历山大·麦克威廉(中世纪盖尔语:;现代盖尔语:;现代化简称为亚历山大二世;1198年8月24日– 1249年7月6日)是苏格兰国王(1214年-1249年在位)。他出生在东洛锡安的哈丁敦,是苏格兰国王
  • 摩尔多瓦语摩尔多瓦语或摩尔达维亚语(摩尔多瓦语:Limba moldovenească / Лимба молдовеняскэ)是摩尔多瓦共和国对罗马尼亚语的称呼之一。历史上摩尔多瓦曾属于罗马尼亚
  • 荀淑荀汪、荀肃、荀旉 (孙子 = 荀彧)荀淑(83年-149年),字季和,东汉颍川颍阴(今河南许昌)人。荀淑是战国荀子的11世孙,年少时即有高名。荀淑虽然博学但不喜欢钻研章句,所以当时常常被一般的