最近在看STL源码剖析,书中提到trivial destructor和no-trivial destructor,初次见到对trivial这个概念非常陌生,经过查资料,又发现一个陌生的概念POD,实在是孤陋寡闻。

下面先对POD进行说明,再对trivial解释。

1、POD

(1) C++03标准中的定义:

POD全称Plain Old Data是指C风格的struct结构体定义的数据结构,其中struct结构体中只能定义常规数据类型(不能含有自定义数据类型)。它仅作为被动的收藏的字段值,不使用封包或者other object-oriented特征。

对于POD类型T的对象,不管这个对象是否拥有类型T的有效值,如果将该对象的底层字节序列复制到一个字符数组(或者无符号字符数组)中,再将其复制回对象,那么该对象的值与原始值一样。

对于任意的POD类型T,如果两个T指针分别指向两个不同的对象obj1和obj2,如果用memcpy库函数把obj1的值复制到obj2,那么obj2将拥有与obj1相同的值。

简言之,针对POD对象,其二进制内容是可以随便复制的,在任何地方,只要其二进制内容在,就能还原出正确无误的POD对象。对于任何POD对象,都可以使用memset()函数或者其他类似的内存初始化函数。

(2) C++11标准定义:

当class/struct是极简的(trivial)、属于标准布局(standard-layout),以及他的所有非静态(non-static)成员都是POD时,会被视为POD。

一个极简的类别或结构符合以下定义:

  1. 极简的默认建构式。这可以使用默认建构式语法,例如SomeConstructor() = default;
  2. 极简的复制建构式,可使用默认语法(default syntax)
  3. 极简的赋值运算子,可使用默认语法(default syntax)
  4. 极简的解构式,不可以是虚拟的(virtual)

一个标准布局(standard-layout)的类别或结构符合以下定义:

  1. 只有非静态的(non-static)资料成员,且这些成员也是符合标准布局的型别
  2. 对所有non-static成员有相同的存取控制(public, private, protected)
  3. 没有虚拟函式
  4. 没有虚拟基础类别
  5. 只有符合标准布局的基础类别
  6. 没有和第一个定义的non-static成员相同型别的基础类别
  7. 若非没有带有non-static成员的基础类别,就是最底层(继承最末位)的类别没有non-static资料成员而且至多一个带有non-static成员的基础类别。基本上,在该类别的继承体系中只会有一个类别带有non-static成员。

(3) imperft 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类(POD class)是一个类,它要么是POD结构,要么是POD联合,POD类型可以具有static成员、成员typedef、嵌套struct/class定义和 成员函数/方法。以下几种是POD:

a、所有基本数据类型 。

b、一个class或者struct,它不包含虚函数,没有虚基类,每一个数据成员都是POD,且所有的父类(如果存在的话)都是POD。

c、POD数组。

d、由POD组成的union。

(4) POD类型的特点

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

(5) POD应用

利用POD类型特性来判断一个类型是否为POD类型:

template<class T> struct must_be_pod

{

union

{

T noname;

};

};

这个模板含义是: 只要类型T是非POD类型,那么编译器将报错,因为T被作为了union的一个成员。

2、trivial destructor

如果用户不定义析构函数,而是用系统自带的,则说明,析构函数基本没有什么用(但默认会被调用)我们称之为trivial destructor。反之,如果特定定义了析构函数,则说明需要在释放空间之前做一些事情,则这个析构函数称为non-trivial destructor。如果某个类中只有基本类型的话是没有必要调用析构函数的,delelte p的时候基本不会产生析构代码。

若类的成员是POD类型数据,则该类的destructor是trivial destructor.

C++中POD和trival语义相关推荐

  1. 【好文收藏】k8s中Pod 无法正常解析域名:部署 DNS 调试工具排查

    k8s 中 Pod 无法正常解析域名:部署 DNS 调试工具排查 问题描述 最近将 Kubernetes 升级到 1.18.1 版本,不过升级完后,查看工作节点的部分 Pod 无法启动,查看消息全是 ...

  2. html中的容器和语义标签

    html中的容器和语义标签 **div **:没有语义 header:通常用于表示页头,也可表示文章的头部 footer:通常表示页脚,也可以表示文章的尾部 article:通常用于表示整篇文章 se ...

  3. Kubernetes中Pod生命周期

    在 Kubernetes中Pod是容器管理的最小单位, 有着各种各样的Pod管理器. 那么一个Pod从启动到释放, 在这期间经历了哪些过程呢? Pod自开始创建, 到正常运行, 再到释放, 其时间跨度 ...

  4. K8S集群中Pod挂载Storageclass存储卷异常排查思路

    K8S集群中Pod挂载Storageclass存储卷异常排查思路 故障描述: Jenkins是在K8S集群中部署的,Jenkins使用的各种资源以及全部创建了,但是Jenkins的Pod依旧无法启动, ...

  5. K8S集群中Pod资源处于CrashLoopBackOff状态排查思路

    K8S集群中Pod资源处于CrashLoopBackOff状态排查思路 文章目录 K8S集群中Pod资源处于CrashLoopBackOff状态排查思路 1.Pod资源处于CrashLoopBackO ...

  6. Kubernetes中pod分类、核心组件、网络模型及kubectl命令使用

    文章目录 Kubernetes中pod分类.核心组件.网络模型及kubectl命令使用 1.k8s中pod分类 2.核心组件 3.网络模型 4.kubectl常用命令使用 Kubernetes中pod ...

  7. K8S集群中Pod与Pod之间网络故障排查思路

    K8S集群中Pod与Pod之间网络故障排查思路 文章目录 K8S集群中Pod与Pod之间网络故障排查思路 1.Pod与Pod之间通信故障 2.Pod与Pod之间网络通信故障排查思路 1.Pod与Pod ...

  8. K8S集群中Pod资源常见的异常状态以及排查思路

    K8S集群中Pod资源常见的异常状态以及排查思路 1.Pod资源的结构 Pod资源中会有一个基础容器Pause容器,每一个Pod资源下都会有一个Pause容器,Pause容器负责创建一个虚拟网络和存储 ...

  9. K8S集群中Pod资源数据丢包排查思路

    K8S集群中Pod资源数据丢包排查思路 Pod资源可能会由于网络原因产生丢包的现象. 当Pod资源存在丢包的现象时,会出现下面的报错: Connect to 100.111.156.74 port 5 ...

最新文章

  1. Rabbit MQ安装配置及常见问题
  2. openvswitch 流表操作(四十八)
  3. 在线实时大数据平台Storm集成redis开发(分布锁)
  4. 【Python】青少年蓝桥杯_每日一题_2.27_杨辉三角
  5. 快速搭建 Serverless 在线图片处理应用
  6. Java黑皮书课后题第3章:*3.32(几何:点的位置)给定一个从点p0(x0,y0)到p1(x1,y1)的有向线段,可以用以下公式判定定点p2(x2, y2)是在线段的左侧、右侧,或者在该线段上
  7. Visual Studio常用小技巧[备忘]
  8. 响应文件是不是标书_什么是标书?投标书有哪些分类?标书和投标书的不同?...
  9. 不定方程求解c语言_事业单位考试备考之数量关系:不定方程的求解
  10. 客户说发货慢怎么回复_女生微信说身体不舒服怎么回复关心她?
  11. html页面授权码,spring boot 2.0 整合 oauth2 authorization code授权码模式
  12. 提交信息html模板,提交留言HTML模板代码
  13. MyBatis-Plus入门篇——CRUD
  14. HTML5移动Web开发指南
  15. python 串口write 返回值_MicroPython 玩转硬件系列4:串口小实验
  16. CGI,FASTCGI,PHP-CGI,PHP-FPM 概念
  17. Windows安装补丁_勒索病毒_补丁号
  18. 网页中文转英文(国际化)
  19. vscode markdown preview enhanced css font
  20. 开发一个APP要多少钱?

热门文章

  1. C语言入门——计算n的阶乘
  2. HP P1008打印机如何打印特殊纸张
  3. Python量化入门:关于收益率的一些概念
  4. iPhone的屏幕密码忘了怎么办
  5. 量产成熟逆变器方案全桥并离网方案STM32F103源代码原理图PCB
  6. 面对电脑辐射如何保护皮肤 - 健康程序员,至尚生活!
  7. 萤石即将科创板上市,拟募资37.39亿布局智能家居和云平台业务
  8. oracle ebs维保费用,ebs oracle YTD期间费用
  9. 微信二手商城产品prd文档
  10. 基于 IB 盈透证券的原生 Python API 连接