本文共 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/