POD (程序设计)

✍ dations ◷ 2025-08-29 20:09:12 #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++名字修饰

相关

  • 19-去甲孕酮19-去甲孕酮(英语:19-Norprogesterone)也叫做19-去甲孕甾-4-烯-3,20-二酮(英语:19-norpregn-4-ene-3,20-dione)是性激素孕酮的结构类似物,只少了19号C原子的甲基。19-去甲孕酮首次
  • 贝尔约翰·斯图尔特·贝尔(英语:John Stewart Bell,1928年6月28日-1990年10月1日),英国北爱尔兰物理学家。最重要的贡献为发展了量子力学中的贝尔定理。约翰·贝尔出生于北爱尔兰的贝
  • 李芳硕李芳硕(1382年-1398年),朝鲜王朝开国之君太祖李成桂第八子,母显妃康氏。高丽禑王八年(1382年)生于松都,李成桂及康氏第二子。朝鲜太祖元年(1392年)八月,立为世子。七年(1398年)八月,靖安君
  • 汉高汉高公司(德语:Henkel KGaA)是一家德国公司,成立于1876年,总部在德国杜塞尔多夫,主营化工产品,包括洗涤剂和清洁剂、化妆品和护肤品、接着剂和密封胶等。旗下主要品牌有宝滢Persil,
  • 索马里先令索马里先令 (索马里语:shilin,意大利语: scellino)是索马里自1962年开始发行的货币。辅币单位为分,1先令=100分。货币编号SOS。目前索马里兰实际使用的是索马里兰先令。 自从1991
  • 迪克·斯雷顿唐纳德·肯特·“迪克”·斯雷顿(英语:Donald Kent 'Deke' Slayton,1924年3月1日-1993年6月13日),美国首批宇航员(“水星计划7人”)之一,但由于心脏问题而不能执行太空任务。他曾任美
  • 小雷蒙德·戴维斯小雷蒙德·“雷”·戴维斯(英语:Raymond "Ray" Davis, Jr.,1914年10月14日-2006年5月31日),美国化学、物理学家,戴维斯、小柴昌俊与里卡尔多·贾科尼,共同获颁2002年诺贝尔物理学奖,
  • 保守力假设一个受到某作用力的粒子,从初始位置移动到终结位置,而此作用力所做的功跟移动路径无关,则称此力为保守力(conservative force),又称为守恒力。等价地说,假设一个粒子从某位置,移
  • 贝勒 (汉学家)埃米尔·布雷特施奈德(德语:Emil Bretschneider;俄语:Эмилий Васильевич Бретшнейдер,1833年-1901年),汉名贝勒,著名俄罗斯汉学家。原波罗的海德国人。早
  • 黄埔站 (广州)黄埔站位于广东省广州市黄埔区黄埔港,是黄埔港支线上的一座二等站,于1940年10月由广州日占当局修建使用,隶属广州铁路集团广州东车站管辖。货运可办理专用线、专用铁路货运作业