什么是POD数据类型

1.POD数据类型的起源

在C语言时代,只有基本数据类型char、int、float和复合数据类型数组、指针、结构体等。但是在C++时代,出现了抽象数据结构class,类的出现伴随着封装、继承、多态三大特性,这些特性导致了类这一数据类型与ANCI C不兼容,为了使得兼容,推出了POD数据结构的概念。

2.POD数据类型的作用

POD数据类型通常被⽤在系统的边界处,即指不同系统之间只能以 底层数据的形式进⾏交互,系统的⾼层逻辑不能互相兼容。⽐如当对象的字段值是从外部数据 中构建时,系统还没有办法对对象进⾏语义检查和解释,这时就适⽤POD来存储数据。

3. POD数据类型的定义

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

3.1.类型是平凡的

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

  • 有平凡的缺省构造函数,可⽤这样的默认语法(SomeConstructor() = default;);
  • 有平凡的copy与move构造函数,可⽤默认语法;
  • 有平凡的copy与move运算符,可⽤默认语法;
  • 有平凡的destructor,不能是虚函数;
  • 构造函数是平凡的,仅当类没有虚成员函数也没有虚基类;
  • Copy/move运算符是平凡的,仅当 没有静态数据成员。

3.2.类型是标准布局的

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

  • 没有虚函数;
  • 没有虚基类;
  • 所有⾮静态数据成员有相同的访问控制(public, private, protected);
  • 所有⾮静态数据成员,包括在任何基类中的,存在于类继承体系中的⼀个类中。
    上述规则适⽤于所有基类与类继承体系中的所有⾮静态数据成员 没有同⼀类型的基类型被定义为第⼀个⾮静态数据成员 ⼀个class/struct/union是POD,当它是平凡的、标准布局的,所有数据成员是POD. 分为两个概念,对象可以不满⾜其中⼀个但是满⾜另外⼀个。例如,类有复杂的move与copy 构造函数,因此不是平凡的,但可能是标准布局因此能与C程序互操作。类似地,⼀个类的有public与private的⾮静态数据成员,因此不是标准布局,但可以是平凡的因此可以memcpy操作。

4.POD数据类型的特性

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

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

参考资料

posted @ 2021-12-08 22:21  曼路的个人博客  阅读(295)  评论(0编辑  收藏  举报