Plain Old Data (POD)

POD指的是这样一些数据类型:基本数据类型、指针、union、数组、构造函数是 trivial 的 struct 或者 class。

POD用来表明C++中与C相兼容的数据类型,可以按照C的方式来处理(运算、拷贝等)。非POD数据类型与C不兼容,只能按照C++特有的方式进行使用。

很多时候,在开发一个C++程序时,程序员会发现需要以统一的风格来操作多个不同的类型。确实,C++以 union 关键字直接提供了这种支持:

union { int i; double d; } u; u.d = 3.14;

u.i = 3; // 覆写 u.d (OK: u.d 是一个 POD 类型)

但是,C++的 union 结构在面向对象的环境下几乎是不可用的。该结构得以保存下来,主要是为了与C兼容,它只能支持 POD (Plain Old Data) 类型,不可以使用带有非平凡构造或析构的类型: union { int i;

std::string s; // 非法: std::string 不是一个 POD 类型! } u;

最早看到POD(plain
old data)类型,是在imperfect
c++里。我觉得这是一本把我带到c++世界里的一本很重要的书。书里是这样解释POD的:

1、
所有标量类型(基本类型和指针类型)、POD结构类型、POD联合类型、以及这几种类型的数组、const/volatile修饰的版
本都是POD类型。

2、
POD结构/联合类型:一个聚合体(包括class),它的非static成员都不是pointer
to class member、

pointer to class
member function、非POD结构、非POD联合,以及这些类型的数组、引用、const/
volatile修饰的版本;

并且,此聚合体不能有用户自定义的构造函数、析构函数、拷贝构造函数.

3、
POD类型可以具有static成员、成员typedef、嵌套struct/class定义和成员函数/方法。(C++标准)给出的定义:

将对象的各字节拷贝到一个字节数组中,然后再将它重新拷贝到原先的对象所占的存储区中,此时该对象应该具有它原来的值。
POD类型的特点:

所有POD类型都可以作为union的成员,反之,所有非POD类型都不

能作为union的成员。
POD特性利用:

我们可以利用POD类型特性来判断一个类型是否为POD类型:
template<class T> struct must_be_pod {
union {

T noname; }; };

这个模板的意思是,只要类型T是非POD类型,那么编译器将报错,因为T被作为了union的一个成员。
VS2008里的测试代码如下:

class A

{

public: A(){}

void f() { cout <<
"A::F" << endl; } protected: private: int i; int
j;

};

template<class T>
struct must_be_pod { union {

T noname; }; };

must_be_pod<A>
a; 编译器会报错:1>member
'must_be_pod<T>::noname' of union

'must_be_pod<T>::<unnamed-tag>'
has user-defined constructor or non-trivial default constructor

其实POD本质就是与c兼容的数据类型。

Plain Old Data (POD)的更多相关文章

  1. Plain Old Data (POD) (转)

    定义 POD类型包括下述C++类型,以及其cv-qualified的类型,还有以其为基类型的数组类型: 标量类型(scalar type) POD类类型(POD class type) 标量类型 术语 ...

  2. Plain old data structure(POD)

    Plain old data structure, 缩写为POD, 是C++语言的标准中定义的一类数据结构,POD适用于需要明确的数据底层操作的系统中.POD通常被用在系统的边界处,即指不同系统之间只 ...

  3. 借助 SIMD 数据布局模板和数据预处理提高 SIMD 在动画中的使用效率

    原文链接 简介 为发挥 SIMD1 的最大作用,除了对其进行矢量化处理2外,我们还需作出其他努力.可以尝试为循环添加 #pragma omp simd3,查看编译器是否成功进行矢量化,如果性能有所提升 ...

  4. Google C++ Style Guide

    Background C++ is one of the main development languages used by many of Google's open-source project ...

  5. C语言编程之道--读书笔记

    C语言语法 const int nListNum =sizeof(aPrimeList)/sizeof(unsigned);//计算素数表里元素的个数 1:#define INM_MAX 32767 ...

  6. Google C++ 代码规范

    Google C++ Style Guide   Table of Contents Header Files Self-contained Headers The #define Guard For ...

  7. C++11新特性——大括号初始化

    C++11之前,C++主要有以下几种初始化方式: //小括号初始化 string str("hello"); //等号初始化 string str="hello" ...

  8. C++11:POD数据类型

    版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 啥是POD类型? POD全称Plain Old Data.通俗的讲,一个类或结构体通过二进制拷贝后还能保持其数据不变,那么它就是 ...

  9. c++11 pod类型(了解)

    啥是POD类型? POD全称Plain Old Data.通俗的讲,一个类或结构体通过二进制拷贝后还能保持其数据不变,那么它就是一个POD类型. 平凡的定义 .有平凡的构造函数 .有平凡的拷贝构造函数 ...

随机推荐

  1. HDU 4436 str2int(后缀自动机)(2012 Asia Tianjin Regional Contest)

    Problem Description In this problem, you are given several strings that contain only digits from '0' ...

  2. HDU 4719 Oh My Holy FFF(DP+线段树)(2013 ACM/ICPC Asia Regional Online ―― Warmup2)

    Description N soldiers from the famous "*FFF* army" is standing in a line, from left to ri ...

  3. maven环境变的配置(复制自己看)

    Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具.由于 Maven 的缺省构建 ...

  4. ExtJS新手学习中常见问题

    1.常常出现运行之后不出现应该出现的效果. 这种情况一般是引用ExtJS路径不正确,要确保路径正确. 示例: <!DOCTYPE html> <html lang="en& ...

  5. [剑指Offer] 14.链表中倒数第k个结点

    [思路]利用两个相隔为k-1个结点的指针进行遍历,当后一个指针移到末尾时,前一个指针就是要求的结点. /* struct ListNode { int val; struct ListNode *ne ...

  6. SQL Server 使用分区函数实现查询优化

    在项目中遇到一个需求,需要在商家收藏信息中,获取到该商家发布的最新一条商品的发布时间,需求很简单,SQL语句也不复杂, select T_UserCollectMerchant.CollectID,T ...

  7. BZOJ4320 ShangHai2006 Homework(分块+并查集)

    考虑根号分块.对于<√3e5的模数,每加入一个数就暴力更新最小值:对于>√3e5的模数,由于最多被分成√3e5块,查询时对每一块找最小值,这用一些正常的DS显然可以做到log,但不太跑得过 ...

  8. Seajs的用法

    以前经常听到Seajs,但是没深入了解过,不清楚到底是用做哪个方面,后来调组到M站做开发,发现项目用到了Seajs,便去了解下 SeaJS是一个遵循CMD规范的JavaScript模块加载框架,可以实 ...

  9. bzoj 1878

    莫队乱搞的第一题,(感觉这个算法初学的时候就能想到啊) 总之就是离线,然后扫一遍然后回答,用数组记录状态 但还是有一个地方不太明白 为什么要除siz?这样为什么会优化复杂度呢?? bool cmp(c ...

  10. WCF分布式开发步步为赢(13):WCF服务离线操作与消息队列MSMQ

    之前曾经写过一个关于MSMQ消息队列的文章:WCF分布式开发必备知识(1):MSMQ消息队列 ,当时的目的也是用它来作为学习WCF 消息队列MSMQ编程的基础文章.在那篇文章里,我们详细介绍了MSMQ ...