• Plain old data structure(POD)


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

    定义

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

    • 标量类型(scalar type)
    • POD类类型(POD class type)

    标量类型

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

    • 算术类型(arithmetic type)
    • 枚举类型(enumeration type)
    • 指针类型(pointer type)
    • 指针到成员类型(pointer-to-member type)

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

    • 整数类型(integral type)
    • 浮点类型(floating type)

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

    • 有符号整数类型 (signed char, short, int, long),
    • 无符号整数类型(unsigned char, unsigned short, unsigned int, unsigned long),
    • 字符类型char与宽字符类型wchar_t
    • 布尔类型bool。
    • 术语浮点类型包括C++的float, double, and long double类型.

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

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

    • 空指针pointer-to-void (void *),
    • 对象指针pointer-to-object与指向静态数据成员的指针pointer-to-static-member-data (都是形如为T*,其中T是对象类型),
    • 函数指针pointer-to-function与指向静态成员函数的指针pointer-to-static-member-function (都是形如T (*)(...),T是函数的返回值的类型).

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

    • 指针到非静态数据成员(pointer-to-nonstatic-member-data), 形如T C::* 表示指向类C的类型为T的数据成员的指针;
    • 指针到非静态成员函数(pointer-to-nonstatic-member-functions), 形如T (C::*)(...) 表示指向类C的返回值类型为T的成员函数的指针.

    POD类类型

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

    • 指针到成员类型的非静态数据成员(包括数组)。
    • 非POD类类型的非静态数据成员(包括数组)。
    • 引用类型的(reference type)非静态数据成员。
    • 用户定义的拷贝与赋值算子。
    • 用户定义的析构函数。


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

    • 用户定义的构造函数。
    • 私有或保护的非静态数据成员。
    • 基类。
    • 虚函数。


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

    用途

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

    一个例子是下述C++的new表达式中的对象初始化,POD与non-POD的区别: non-POD类型的对象或数组总是被初始化;而POD类型的对象或数组可能未被初始化.

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

    • 内存布局——POD对象的组成字节是连续的.
    • 初始化——对于non-const POD对象,如果没有初始化声明时,具有不确定的初值(indeterminate initial value) . POD对象的缺省初始化为0值. 静态POD对象初始化为给定的初值,如果是局部静态POD对象,在进入所在作用域之前初始化; 对于非局部静态POD对象,在任何动态初始化之前赋予初值.
    • 拷贝——POD对象可直接拷贝(例如用memcpy())到其它字符数组或相同POD类型的对象,保持其值不变。POD类型可以用作标准模板字符串类的字符. 由于这个原因,函数的返回值如果是non-POD类型,则不能通过寄存器传递函数的返回值。
    • 寻址——一个POD对象的地址可以是一个地址常量表达式;一个对POD成员的引用可以是一个引用常量表达式. 一个POD-struct对象的指针,适合用reinterpret_cast转换到它的初始值.
     1 #include <iostream>
     2 using namespace std;
     3 
     4 /// POD
     5 template<typename T>
     6 struct POD
     7 {
     8     static const bool Result=false;
     9 };
    10 template<>struct POD<bool>{static const bool Result=true;};
    11 template<>struct POD<signed char>{static const bool Result=true;};
    12 template<>struct POD<unsigned char>{static const bool Result=true;};
    13 template<>struct POD<signed short>{static const bool Result=true;};
    14 template<>struct POD<unsigned short>{static const bool Result=true;};
    15 template<>struct POD<signed int>{static const bool Result=true;};
    16 template<>struct POD<unsigned int>{static const bool Result=true;};
    17 template<>struct POD<signed long long>{static const bool Result=true;};
    18 template<>struct POD<unsigned long long>{static const bool Result=true;};
    19 template<>struct POD<char>{static const bool Result=true;};
    20 template<>struct POD<wchar_t>{static const bool Result=true;};
    21 template<typename T>struct POD<T*>{static const bool Result=true;};
    22 template<typename T>struct POD<T&>{static const bool Result=true;};
    23 template<typename T, typename C>struct POD<T C::*>{static const bool Result=true;};
    24 template<typename T, int _Size>struct POD<T[_Size]>{static const bool Result=POD<T>::Result;};
    25 template<typename T>struct POD<const T>{static const bool Result=POD<T>::Result;};
    26 template<typename T>struct POD<volatile T>{static const bool Result=POD<T>::Result;};
    27 template<typename T>struct POD<const volatile T>{static const bool Result=POD<T>::Result;};
    28 
    29 /// Test Def
    30 class MyClass{int a,b;};
    31 class MyPOD{int a,b;};
    32 typedef int* PTI;
    33 typedef int ARR[10];
    34 typedef int& BAS;
    35 typedef const int CON;
    36 typedef std::pair<int,int> PII;
    37 typedef std::pair<MyClass,MyPOD> PMM;
    38 template<>struct POD<MyPOD>{static const bool Result=true;};
    39 template<typename K, typename V>struct POD< std::pair<K, V> >{static const bool Result=POD<K>::Result && POD<V>::Result;};
    40 
    41 int main()
    42 {
    43     /// Test Code
    44     cout << POD<int>::Result << endl;
    45     cout << POD<PTI>::Result << endl;
    46     cout << POD<ARR>::Result << endl;
    47     cout << POD<BAS>::Result << endl;
    48     cout << POD<CON>::Result << endl;
    49     cout << POD<MyClass>::Result << endl;
    50     cout << POD<MyPOD>::Result << endl;
    51     cout << POD<PII>::Result << endl;
    52     cout << POD<PMM>::Result << endl;
    53     return 0;
    54 }
  • 相关阅读:
    大话计算机网络一 聊聊UDP
    Go调度器系列(2)宏观看调度器
    Go语言高阶:调度器系列(1)起源
    gin+go-micro+etcd实战一
    记录一次云主机部署openstack的血泪史
    paste deploy 学习笔记
    Openstack计算Nova组件
    jumpserver docker简单搭建
    [原创][开源] SunnyUI.Net 帮助文档目录
    [原创][开源]SunnyUI.Net, C# .Net WinForm开源控件库、工具类库、扩展类库、多页面开发框架
  • 原文地址:https://www.cnblogs.com/zinthos/p/3947706.html
Copyright © 2020-2023  润新知