POD (程序设计)

✍ dations ◷ 2025-09-16 07:22:08 #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++名字修饰

相关

  • 干燥性角结膜炎干眼症(英语:Dry eye syndrome, DES),又名干性角结膜炎(keratoconjunctivitis sicca, KCS),是一种眼睛干涩的状态。其他的症状包括眼睛过敏、发红、多眼屎或是容易疲劳,也可能出现视
  • 克洛维四世克洛维四世(法语:Clovis IV;680年-695年3月),有时会被称为克洛维三世(若认为之前的克洛维三世是篡位者),法兰克王国墨洛温王朝的全法兰兄国王(691年4月12日—695年3月在位)。提乌德里克
  • 李森茂李森茂(1929年-1996年6月18日),天津宁河县人。1988年至1992年担任中华人民共和国铁道部部长。于1949年加入中国共产党。1982年任铁道部副部长。1988年被选为中华人民共和国铁道
  • 坦格朗丹格朗(印尼语:Tangerang)是印尼万丹省的一个城市,位于雅加达西方25公里处。丹格朗是雅茂德丹勿(Jabotabek)地区仅次于雅加达与勿加泗的第三大市中心。总面积为164.54平方公里,2010
  • 乔治·珀尔乔治·珀尔(英语:George Perle,1915年5月6日-2009年1月23日),美国作曲家、音乐理论家。生于新泽西州贝永,毕业于德保罗大学,曾以私人学生身份跟随克热内克学习。二战时加入过美军。1
  • 伊基·波普伊基·波普(Iggy Pop,1947年4月21日-),本名小詹姆斯·纽威尔·奥斯特伯格(James Newell Osterberg, Jr.),美国歌手、音乐家,有时会参与戏剧演出,伊吉·帕普在朋克摇滚等音乐类型中被认
  • 城市地质信息系统城市地质信息系统是地理信息系统(GIS)在城市地质中的应用,系通过应用信息技术,采集、存储、管理、分析、可视化城市地质数据的系统,可应用于城市规划、建设和管理之中。同地理信
  • XfceXfce是桌面环境,用于Unix与Unix-like操作系统,如Linux与FreeBSD。Xfce建基在GTK+之上,它同时为程序设计者提供开发框架。Xfce使用Xfwm作为默认的视窗管理器,亦可搭配Openbox等其
  • 伊恩·麦凯伦伊恩·麦凯伦爵士,CH,CBE(Sir Ian McKellen,1939年5月25日-)是一位英国男演员,被誉为是英国最杰出的演员之一。伊恩·麦凯伦的戏路甚广,包括在舞台上演出严肃的莎士比亚剧作、现代戏
  • 潜江龙虾潜江龙虾,是中华人民共和国湖北省潜江市的一个小龙虾土特产。潜江是中国淡水龙虾加工出口和人工养殖面积最大的县级市。2009年6月,当地创建中国湖北潜江龙虾节,之后每年六月举