POD (程序设计)

✍ dations ◷ 2025-06-08 12:39:35 #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++名字修饰

相关

  • 杆状核粒细胞杆状核粒细胞(英语:band cell、band neutrophil、stab cell)是一种正在骨髓进行粒细胞生成(英语:granulopoiesis)的粒细胞前体,也会被释出到血液中,由晚幼粒细胞(metamyelocyte)发育而
  • 鼻音鼻音是按发音方法分类的一类辅音。发音时,口腔中的气流通路被阻塞,软颚下垂,气流通过鼻腔,与气流从口腔流出的口腔辅音相对。 (少数的挤喉音可能同时具有口腔辅音与鼻音的性质。)
  • 普里什蒂纳普里什蒂纳(阿尔巴尼亚语:Prishtina/Prishtinë,塞尔维亚语:Приштина/Priština)是科索沃共和国的首都,位于该国东北部。科索沃独立前属于塞尔维亚共和国,为科索沃自治省的
  • 卡尔斯巴德洞窟国家公园卡尔斯巴德洞窟国家公园(Carlsbad Caverns National Park)是美国的一座国家公园,位于新墨西哥州东南部。公园的特色为卡尔斯巴德洞窟。游客可以通过天然入口徒步进入,也可以通过
  • 新加坡直辖殖民地新加坡殖民地是一个英国直辖殖民地,存在于1946年至1963年,后来新加坡加入马来西亚联邦。当二次世界大战结束日本向盟军投降后,新加坡岛的主权在1945年回到英国手上。1946年,海峡
  • 宇迦宇迦(युग,Yuga),又称为时,是印度教中的时代单位,共有圆满时、三分时、二分时、争斗时四个宇迦。目前所在的宇迦为争斗时,自公元前3102年开始。四个宇迦的时间具体为:其中,一天年合
  • 准新翅总目准新翅总目(学名:Paraneoptera),或作准新翅亚节、副翅目等,是昆虫的一个单系总目。 准新翅总目物种的口器反映了物种间进食习惯的多样性:基群以微生物表面为食,而更高级的群体则以
  • 复活节歌《复活节歌》,拉丁语:,又名《子兮女兮》、《复活节欢呼颂》和《耶稣复生》,是一首基督宗教复活节圣歌。被收录于众多歌本,这首圣歌由十二个诗节构成,例如:这首圣歌由方济各会修道士
  • 群马县第3区群马县第3区是日本众议院的选区,设立于1994年。北海道 13 | 山形县 4 | 静冈县 9 | 岛根县 3 | 大分县 4福井县 3 | 山梨县 3 | 德岛县 3 | 高知县 3 | 佐贺县 3青森县 4 |
  • 格劳乔·马克思朱利叶斯·亨利·格劳乔·马克思(Julius Henry "Groucho" Marx,1890年10月12日-1977年8月19日)是美国的喜剧演员与电影明星。他以机智问答及比喻闻名,与家族成员(马克思兄弟)合作拍