Plain Old Data (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转换到它的初始值
#include <iostream>
using namespace std; /// POD
template<typename T>
struct POD
{
static const bool Result=false;
};
template<>struct POD<bool>{static const bool Result=true;};
template<>struct POD<signed char>{static const bool Result=true;};
template<>struct POD<unsigned char>{static const bool Result=true;};
template<>struct POD<signed short>{static const bool Result=true;};
template<>struct POD<unsigned short>{static const bool Result=true;};
template<>struct POD<signed int>{static const bool Result=true;};
template<>struct POD<unsigned int>{static const bool Result=true;};
template<>struct POD<signed long long>{static const bool Result=true;};
template<>struct POD<unsigned long long>{static const bool Result=true;};
template<>struct POD<char>{static const bool Result=true;};
template<>struct POD<wchar_t>{static const bool Result=true;};
template<typename T>struct POD<T*>{static const bool Result=true;};
template<typename T>struct POD<T&>{static const bool Result=true;};
template<typename T, typename C>struct POD<T C::*>{static const bool Result=true;};
template<typename T, int _Size>struct POD<T[_Size]>{static const bool Result=POD<T>::Result;};
template<typename T>struct POD<const T>{static const bool Result=POD<T>::Result;};
template<typename T>struct POD<volatile T>{static const bool Result=POD<T>::Result;};
template<typename T>struct POD<const volatile T>{static const bool Result=POD<T>::Result;}; /// Test Def
class MyClass{int a,b;};
class MyPOD{int a,b;};
typedef int* PTI;
typedef int ARR[];
typedef int& BAS;
typedef const int CON;
typedef std::pair<int,int> PII;
typedef std::pair<MyClass,MyPOD> PMM;
template<>struct POD<MyPOD>{static const bool Result=true;};
template<typename K, typename V>struct POD< std::pair<K, V> >{static const bool Result=POD<K>::Result && POD<V>::Result;}; int main()
{
/// Test Code
cout << POD<int>::Result << endl;
cout << POD<PTI>::Result << endl;
cout << POD<ARR>::Result << endl;
cout << POD<BAS>::Result << endl;
cout << POD<CON>::Result << endl;
cout << POD<MyClass>::Result << endl;
cout << POD<MyPOD>::Result << endl;
cout << POD<PII>::Result << endl;
cout << POD<PMM>::Result << endl;
return ;
}
Plain Old Data (POD) (转)的更多相关文章
- Plain Old Data (POD)
Plain Old Data (POD) POD指的是这样一些数据类型:基本数据类型.指针.union.数组.构造函数是 trivial 的 struct 或者 class. POD用来表明C++中与 ...
- Plain old data structure(POD)
Plain old data structure, 缩写为POD, 是C++语言的标准中定义的一类数据结构,POD适用于需要明确的数据底层操作的系统中.POD通常被用在系统的边界处,即指不同系统之间只 ...
- 借助 SIMD 数据布局模板和数据预处理提高 SIMD 在动画中的使用效率
原文链接 简介 为发挥 SIMD1 的最大作用,除了对其进行矢量化处理2外,我们还需作出其他努力.可以尝试为循环添加 #pragma omp simd3,查看编译器是否成功进行矢量化,如果性能有所提升 ...
- Google C++ Style Guide
Background C++ is one of the main development languages used by many of Google's open-source project ...
- C语言编程之道--读书笔记
C语言语法 const int nListNum =sizeof(aPrimeList)/sizeof(unsigned);//计算素数表里元素的个数 1:#define INM_MAX 32767 ...
- Google C++ 代码规范
Google C++ Style Guide Table of Contents Header Files Self-contained Headers The #define Guard For ...
- C++11新特性——大括号初始化
C++11之前,C++主要有以下几种初始化方式: //小括号初始化 string str("hello"); //等号初始化 string str="hello" ...
- C++11:POD数据类型
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 啥是POD类型? POD全称Plain Old Data.通俗的讲,一个类或结构体通过二进制拷贝后还能保持其数据不变,那么它就是 ...
- c++11 pod类型(了解)
啥是POD类型? POD全称Plain Old Data.通俗的讲,一个类或结构体通过二进制拷贝后还能保持其数据不变,那么它就是一个POD类型. 平凡的定义 .有平凡的构造函数 .有平凡的拷贝构造函数 ...
随机推荐
- python - 字符编码/格式化/替换符
- Android自定义控件三种方式
1.组合原生控件(继承自ViewGroup.LinearLayout.FrameLayout.RelativeLayout等) 将原生空间做组合,自定义一些事件 2.自己绘制控件(继承自View) ...
- sqoop导数据
1.添加oracle jdbc驱动 https://blog.csdn.net/eason_oracle/article/details/76836758 2.
- OGG初始加载过程概述
您可以使用Oracle GoldenGate来: 执行独立的批量加载以填充数据库表以进行迁移或其他用途. 将数据作为初始同步运行的一部分加载到数据库表中,以准备与Oracle GoldenGate进行 ...
- cei()、linspace()、arrange()、full()、eye()、empty()、random()
1.np.ceil()函数 np.ceil()函数为朝正无穷方向取整 a = np.array([-1.7, -1.5, -0.2, 0.2, 1.5, 1.7, 2.0]) print(np.cei ...
- 【转】python模块分析之hashlib加密(二)
[转]python模块分析之hashlib加密(二) hashlib模块是用来对字符串进行hash加密的模块,明文与密文是一一对应不变的关系:用于注册.登录时用户名.密码等加密使用.一.函数分析:1. ...
- http://nancyfx.org + ASPNETCORE
商务产品servicestack: https://servicestack.net/ http://nancyfx.org + ASPNETCORE http://nancyfx.org ...
- Nginx在线服务状态下平滑升级及ab压力测试【转】
今天,产品那边发来需求,说有个 APP 的 IOS 版本下载包需要新增 https 协议,在景安购买了免费的 SSL 证书.当我往 nginx 上新增 ssl 时,发现服务器上的 nginx 居然没编 ...
- BZOJ - 2809 dispatching 主席树+dfs序
在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个上级.为保密,同时增强忍者们的 ...
- you-get 2017-06-02
可下载优酷土豆的1080p视频 修订版本 针对最近优酷土豆升级后无法下载的问题进行修改 需要安装 python3 和 ffmpeg http://pan.baidu.com/s/1c2hBCe0