本节内容主要讲 POD 这个概念。先说明为什么会出现这个概念,然后列举了具备 POD 特征的类、结构体应该具有什么特点,最后一个小例子说明如何使用 POD 数据。因为写容器的时候涉及到这个概念,所以作为预备知识先写了本文。

概述

很久很久以前,C 语言统一了江湖。几乎所有的系统底层都是用 C 写的,当时定义的基本数据类型有 int、char、float 等整数类型、浮点类型、枚举、void、指针、数组、结构等等。然后只要碰到一串 01010110010 之类的数据,编译器都可以正确的把它解析出来。

那么到了 C++ 诞生之后,出现了继承、派生这样新的概念,于是就诞生了一些新的数据结构。比如某个派生类,C 语言中哪有派生的概念啊,遇到这种数据编译器就不认识了。可是我们的计算机世界里,主要的系统还是用 C 写的啊,为了和旧的 C 数据相兼容,C++ 就提出了 POD 数据结构概念。

POD 是 Plain Old Data 的缩写,是 C++ 定义的一类数据结构概念,比如 int、float 等都是 POD 类型的。Plain 代表它是一个普通类型,Old 代表它是旧的,与几十年前的 C 语言兼容,那么就意味着可以使用 memcpy() 这种最原始的函数进行操作。两个系统进行交换数据,如果没有办法对数据进行语义检查和解释,那就只能以非常底层的数据形式进行交互,而拥有 POD 特征的类或者结构体通过二进制拷贝后依然能保持数据结构不变。也就是说,能用 C 的 memcpy() 等函数进行操作的类、结构体就是 POD 类型的数据

基本上谈到这个概念,一般都是说某某 class、struct、union 是不是 POD 类型的。

POD 的特征

是不是 POD 类型的,可以用 is_pod<T>::value 来判断。那什么样的类、结构体是拥有 POD 特性的呢?要求有两个:一个是它必须很平凡、很普通;另一个是布局有序。

能平凡就平凡

trival(平凡)是个概念,我也暂时找不到特别合适的翻译,满足以下条件即可:

  • 不能写 构造/析构函数拷贝/移动构造函数拷贝/移动运算符,而是用编译器自动为我们生成,那这个数据就是“平凡的”。非要写的话,用 C++ 11 的 default 关键字。例如下列代码用 std::is_trivial<T>::value 来判断是否“平凡”。

你看,A 类手写了个构造函数,虽然什么都没填,但这构造函数已经不是编译器默认提供的了,所以不平凡,所以就不是 POD 类,自然就不能用诸如 memcpy() 这种 C 语言的函数来操作;B 类的一堆构造函数啥的都没写,默认由编译器提供,所以是平凡的;C 类虽然写了构造函数,但用了 C++11 的 default 关键字修饰,也是平凡的。

  • 不能有 虚函数 和 虚基类。只要满足以上条件,就是拥有平凡特征的数据类型。

布局要有序

除了平凡之外,还对布局有要求。为了便于理解讲述,我们把非静态数据称为普通数据。

  • 普通成员有相同的访问级别。例如下面的类,因为 a 和 b 的访问级别不一样,所以布局无序,自然就不是 POD 类型的数据。当然,如果 b 写成 static int b,例子中的 A 类就是 POD 类型的了。所以一定要看清每个字,是“普通成员”哦。

  • 第一个成员必须是自己的

  • 只要有父类,普通成员只能在其中一个类中,不可分散。因为 C 没有继承的概念,所以就别把普通成员在两个类中都写,写在一个类中就像 C 的风格了。如下图的代码,从 A 的角度看上边没有父类,就按上文的规则去判断是否是 POD 类型。从 A1 的角度看上边有个父类,这个时候就要看父子两个是否都有普通成员了,都有的话肯定不行,只能其中一个有。

如何使用 POD 类型的数据?

前面既然说了,具有 POD 性质的数据可以使用 C 语言中的 memcpy() 等底层函数,那我们来看看怎么用。

以上就是 POD 的内容,希望大家能搞懂,这对以后写的容器相关的文章有关。

https://zhuanlan.zhihu.com/p/45545035

什么是 POD 数据类型?相关推荐

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

    平凡的定义 1.有平凡的构造函数 2.有平凡的拷贝构造函数 3.有平凡的移动构造函数 4.有平凡的拷贝赋值运算符 5.有平凡的移动赋值运算符 6.有平凡的析构函数 7.不能包含虚函数 8.不能包含虚基 ...

  2. C++ Aggregate 与 POD(Plain Old Data)的解释

    无论是 Aggregate 还是 POD(Aggregates的升级版)都是对用来约束初始化的精巧的概念. motivation 当我们欲构造如下的union时: union {int i;std:: ...

  3. C/C++编程:POD类型

    概叙 很久之前,C语言统一了江湖,几乎所有的系统底层都是用C写的,当时定义大的基本数据类型类型有 int.char.float 等整数类型.浮点类型.枚举.void.指针.数组.结构等等.然后只要碰到 ...

  4. 《Boost程序完全开发指南》

    1.3开发环境 由于Boost大量使用了C++高级特性(如模板偏特化.ADL),因此不是所有的编译器都 能够很好地支持Boost. 在VC集成环境中使用嵌入工程编译的方式需要定义宏BOOST_ALL_ ...

  5. 《linux多线程服务端编程》---- C++基础前奏

    1 mutable 在C++中,mutable也是为了突破const的限制而设置的.被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中. 该关键字修饰类中数据成员时,会释放掉 ...

  6. K8s笔记1----入门基础与fannel网络

    1.k8s网络通信方式(一个node还是一个docker服务,只有一个docker0路由器,会有flannel0在监听docker0,一个node多个pod的时候由本机的dokcer0分配每一个pod ...

  7. STL_空间配置器allocator

    空间配置器 所有的STL的操作对象(所有的数值)都存放在容器内,而容器一定要配置空间才能存放资料 空间配置器的标准接口 typedef unsigned int size_t: allocator:: ...

  8. 【C语言避坑指南】学习记录

    学习自B站Up双笙子佯谬的视频 [C语言避坑指南]看完这个视频,我再也不害怕指针!_哔哩哔哩_bilibili课件:https://github.com/parallel101/course作业:ht ...

  9. boost uuid

    uuid:  uuid库是一个小的使用工具,可以表示和生成UUID  UUID是University Unique Identifier的缩写,它是一个128位的数字(16字节),不需要有一个中央认证 ...

最新文章

  1. 2021-2027年中国室内游艺设备行业研究及前瞻分析报告
  2. hdu 5631 Rikka with Graph(无向图的割边)
  3. java null布局_Java中的null布局
  4. GCC G++ C C++的区别
  5. Hexo添加helper-live2d模型
  6. ENVI大气校正后遥感图像颜色变了及编辑头文件
  7. GlobalKnowledge: 2013 IT 技能薪水报告
  8. unity xml反序列化为数据类
  9. win7休眠 计算机管理,win7休眠设置在哪 win7休眠设置方法【图文】
  10. uniapp 之 禁用手机物理返回键
  11. 如果我们能正预基面因子
  12. ads1278_ADS1278
  13. python 战舰_Python战舰:获取用户输入的他们想要多少艘战舰
  14. ShardingSphere 5.2.1 发布|新增系统库、强制分片路由、一致性校验
  15. 大脑神经网络具有什么性,神经网络跟大脑的关系
  16. C++长整型(long long)64位整型耗时问题
  17. “毕业季”|一个java开发实习生的OFFER之路
  18. 2018红帽杯线上预选赛 wp---MISC
  19. BYOD策略的制定关乎企业网络安全
  20. 百度地图 key_百度地址智能解析amp;百度地图更新

热门文章

  1. Livox Lidar+海康Camera实时生成彩色点云
  2. 应用计算机技术的纺织行业,计算机技术在纺织行业中的应用
  3. modelsim 仿真中出现Modele ~~~ is not defined
  4. 启明星辰集团CEO严望佳:与AI共生,共建以人为本的数字善治生态体系
  5. 抖音的10个规则,AI大数据帮你解决
  6. [开源]KT1025A可能是功能最全面的MP3蓝牙音频数传芯片BT201模块方案
  7. linux的more 查看命令,linux中more命令如何查找
  8. 2022年美容师(初级)考试题模拟考试平台操作
  9. BP神经网络分类以及对算法进行改进—MATLAB实现
  10. ERROR: The Nouveau kernel driver is currently in use by your system;新电脑安装NVIDIA的GPU驱动报错问题解决