最近在看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。
一个极简的类别或结构符合以下定义:
- 极简的默认建构式。这可以使用默认建构式语法,例如SomeConstructor() = default;
- 极简的复制建构式,可使用默认语法(default syntax)
- 极简的赋值运算子,可使用默认语法(default syntax)
- 极简的解构式,不可以是虚拟的(virtual)
一个标准布局(standard-layout)的类别或结构符合以下定义:
- 只有非静态的(non-static)资料成员,且这些成员也是符合标准布局的型别
- 对所有non-static成员有相同的存取控制(public, private, protected)
- 没有虚拟函式
- 没有虚拟基础类别
- 只有符合标准布局的基础类别
- 没有和第一个定义的non-static成员相同型别的基础类别
- 若非没有带有non-static成员的基础类别,就是最底层(继承最末位)的类别没有non-static资料成员而且至多一个带有non-static成员的基础类别。基本上,在该类别的继承体系中只会有一个类别带有non-static成员。
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(Plain Old Data)概念,包括其定义、特点和应用,并详细解释了trivial destructor,即默认无操作的析构函数,及其在处理POD类型时的作用。

520

被折叠的 条评论
为什么被折叠?



