Trivial(平凡)和Non-Trivial(不平凡)是对于class(类)的或者类中的四个函数而言的:
1.构造函数
2.拷贝构造函数
3.赋值函数
4.析构函数
Trivial
其中Trivial(平凡)的概念本人的理解是无意义的,Trivial是相对于Non-Trivial而言的。
Non-Trivial
对于Non-Trivial而言的,如果上面四种函数满足以下三点任意一项或一项以上:
1.有基类
2.显式(explict)定义了以上四种函数一种或以上
3.类里有非静态非POD的数据成员
那么该类就是Non-Trivial(不平凡)有意义的,所以有意义(Non-Trivial)的函数都有一些“多余”的操作,和系统自动创建的默认缺省函数有些差别。而有意义(Non-Trivial)的类则是含有Non-Trivial的函数。
POD
POD(Plain Old Data)是指C风格的struct结构体定义的数据结构或者C++的内建类型。
C++ 03:对于POD对象,其二进制内容是可以随便复制的,在任何地方,只要其二进制内容在,就能还原出正确无误的POD对象。对于任何POD对象,都可以使用memset()函数或者其他类似的内存初始化函数。
如果一个类或结构是Trivial(平凡)的,具有标准布局的,且不包含任何非POD的非静态成员,那么它就被认定是POD类型。POD类型必然有以上提到的四种Trivial(平凡)函数。
平凡的类或结构定义如下:
1.具有一个平凡的缺省构造器 (可使用default关键字)
2.具有一个平凡的拷贝构造器 (可使用default关键字)
3.具有一个平凡的拷贝赋值运算符(可使用default关键字)
4.具有一个非虚且平凡的析构器
具有标准布局的类或结构被定义如下:
1.所有非静态数据成员均为标准布局类型
2.所有非静态成员的访问权限(public, private, protected) 均相同
3.没有虚函数
4.没有虚基类
5.所有基类均为标准布局类型
6.没有任何基类的类型与类中第一个非静态成员相同
7.要么全部基类都没有非静态数据成员,要么最下层的子类没有非静态数据成员且最多只有一个基类有非静态数据成员。总之继承树中最多只能有一个类有非静态数据成员。所有非静态数据成员必须都是标准布局类型。
POD的优点
1.字节赋值, 代码中我们可以安全的使用memset和memcpy函数对POD类型进行初始化和拷贝等操作
2.提供了对C内存布局的兼容,C++程序可以与C函数进行相互的操作,因为POD类型的数据在C++与C之间的操作总是安全的
3.保证了静态初始化的安全有效,静态初始化在很多时候能够提高程序的性能,而POD类型的对象初始化往往更加简单(比如放在目标文件的.bss段,在初始化中直接被赋0)