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).
- POD数据类型
- c++的POD数据类型
- C++11:POD数据类型
- 【C++11】POD数据类型
- C++11:POD数据类型
- C++之POD数据类型
- 什么是POD数据类型?
- 什么是POD数据类型?
- 【C++进阶】C++的POD数据类型
- POD
- POD
- POD
- pod
- POD
- pod
- "POD" 类型
- POD驱动
- POD对象
- Android Adapter
- 用IT技术玩金融系列文章
- Word Break
- sdfgfhrtesfgd
- hdu 18651sting 01背包
- POD数据类型
- 逆向教程->anime radio逆向分析去广告(回编译错误分析)
- linux 环境下 用maven 创建项目(子项目分层创建)springMVC项目
- Demo POI
- CView中OnDraw()函数调用的时间
- AppScan安全漏洞报告
- leetCode:Convert Sorted Array to Binary Search Tree
- 有关ElasticSearch的一些备忘事项
- UNDEFINED REFERENCE TO `YYWRAP'