POD数据类型

来源:互联网 发布:林小宅扒皮 知乎 编辑:程序博客网 时间:2024/05/20 18:41

POD全称Plain Old Data——数据类型满足了”平凡的定义“和”标准布局“

通俗的讲,一个类或结构体通过二进制拷贝后还能保持其数据不变,那么它就是一个POD类型。


平凡的定义:

1.有平凡的构造函数

2.有平凡的拷贝构造函数

3.有平凡的移动构造函数

4.有平凡的拷贝赋值运算符

5.有平凡的移动赋值运算符

6.有平凡的析构函数

7.不能包含虚函数

8.不能包含虚基类

 

标准布局的定义:

1.所有非静态成员有相同的访问权限

2.继承树中最多只能有一个类有非静态数据成员

3.子类的第一个非静态成员不可以是基类类型

4.没有虚函数

5.没有虚基类

6.所有非静态成员都符合标准布局类型

 

POD到底有什么好处呢?

1.字节赋值, 代码中我们可以安全的使用memset和memcpy函数对POD类型进行初始化和拷贝等操作.

2.提供了对C内存布局的兼容. C++程序可以与C函数 进行相互的操作, 因为POD类型的数据在C++与C之间的操作总是安全的.

3.保证了静态初始化的安全有效, 静态初始化在很多时候能够提高程序的性能, 而POD类型的对象初始化往往更加简单(比如放在目标文件的.bss段 , 在初始化中直接被赋0).

 

C++11将POD划分为两个基本概念的集合(只有满足这两个基本概念才能成为是POD类型):

1.平凡的(trivial)

2.标准布局的(standard layout)

 

一个trivial class或者struct应该符合以下定义:

1)拥有平凡的默认构造函数(trivial constructor)和析构函数(trivialdestructor).

trivial constructor就是说构造函数什么都不干,通常情况下, 不定义类的构造函数, 编译器就会自动生成一个trivialconstructor, 而一旦定义了构造函数, 即使构造函数中不包含任何参数, 函数体中也没有任何代码, 那么该构造函数都不再是trivial的(non-trivial),

 

2)拥有平凡的复制构造函数(trivial copy constructor)和移动构造函数(trivial move constructor), 同trivial constructor一样, 不声明trivial copy constructor的话, 编译器会自动生成一个, 同样也可以显示的使用 = defualt声明缺省的复制构造函数.

 

 

PS: trivial move ctor与trivial copy ctor类似, 只不过适用于move语义

 

3)拥有平凡的复制赋值运算符(trivial assignment operator)和移动赋值运算符(trivial

move operator). 这些基本上与第二点中说的类似.

 

4)不能包含虚拟函数和虚拟基类.

我们可以使用C++11中新提供的一些工具来检测某个类型是否为trivial的:

template< typename _T > structstd::is_trivial;

我们可以根据is_trivial模板的bool成员value判断_T是否为一个trivial类型

具体关于<type_traits>和std::is_trivial等工具的用法可以参考:

http://www.cplusplus.com/reference/type_traits/


POD类型的另一个概念是标准布局(standard layout).

0 0