博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++中的trivial、standard layout、POD
阅读量:4255 次
发布时间:2019-05-26

本文共 996 字,大约阅读时间需要 3 分钟。

在学习STL的时候,会反复出现trivial和POD这样的术语,这几个概念如果要特别仔细地区分,只能说是蛋疼。

但是结合其在STL里面的用意,为了性能优化,不那么学究地去考究其意义还是相对好理解的。

trivial是从其拷贝控制函数是否是系统合成的来说明的

standard layout是从其内部布局是否类似于C中的struct来说明的

POD(Plain Old Data)这里的Old就是指的C语言的意思,它是从所有行为是否基本类似于C中的struct来说明的

所以,POD比trivial和standard layout更加严格,是POD必定满足trivial和standard layout

这个帖子对这三个概念做了详细描述,以及实验比较,非常好。

下面来详细说说trivial和POD,参考资料是

它里面的解释和C++标准几乎一模一样

1.trivial

(1)scalar types

(2)trivial classes

(3)arrays of any such types(1,2)

其中(1)说穿了就是系统内置类型,(2)说穿了就是满足一定要求的类类型(由C++关键字class、sturct、unoin定义),(3)以上两种类型的数组

下面来详细说说,这个满足一定要求是满足哪些要求:

①拥有合成的默认构造函数、合成的拷贝构造函数、合成的移动构造函数

合成的拷贝赋值运算符、合成的移动构造运算符、合成的析构函数

②没有虚成员(不含虚函数以及虚基类)

③没有类内初始化的非静态数据成员

④如果它拥有基类或者非静态成员,它们也应该是trivial的

2.POD

(1)scalar types

(2)trivial classes

(3)arrays of any such types(1,2)

非常类似于trivial的要求,其中(2)表示的意思基本可以认为它既是trivial也是standard layout的

3.POD的作用

STL会根据对象是否是POD类型的,从而影响到对于这个对象的构造与析构的过程。

如果是非POD,当然为了安全就老老实实调用构造函数和析构函数了。

如果是POD类型,这个类型就完全可以当做C语言中的数据结构来处理,对其构造时完全不用初始化为确定值,对其析构时可以什么也不做,

而不会引发额外的风险(超过C语言本身的风险),从而提升效率。

转载地址:http://gniei.baihongyu.com/

你可能感兴趣的文章
【C++】C++11 STL算法(八):对未初始化内存的操作(Operations on uninitialized memory)、C库(C library)
查看>>
【数据库】sqlite中的限制:数据库大小、表数、列数、行数、参数个数、连接数等
查看>>
【数据库】SQLite和MySQL之间的对比和选择
查看>>
【数据库】sqlite3数据库备份、导出方法汇总
查看>>
【数据库】适用于SQLite的SQL语句(一)
查看>>
【数据库】适用于SQLite的SQL语句(二)
查看>>
【数据库】适用于SQLite的SQL语句(三)
查看>>
【C++】error: passing ‘const xxx’ as ‘this’ argument discards qualifiers [-fpermissive]
查看>>
【C++】C++11 STL算法(九):番外篇
查看>>
【C++】C++11 STL算法(十):使用STL实现排序算法
查看>>
【网络编程】同步IO、异步IO、阻塞IO、非阻塞IO
查看>>
【网络编程】epoll 笔记
查看>>
【视频】视频传输协议:RTSP、RTP、RTCP、RTMP、HTTP
查看>>
【经验】向word中插入格式化的代码块
查看>>
【经验】配置Anaconda源
查看>>
【AI】在win10上安装TensorFlow2,安装成功,但是import tensorflow时报错:pywrap_tensorflow.py", line 58
查看>>
【Qt】Qt编码风格、命名约定
查看>>
【C++】重载、重写、隐藏
查看>>
【Qt】重新认识QObject
查看>>
【Qt】Qt源码中涉及到的设计模式
查看>>