C++中的POD类型

POD(Plain Old Data)类型是C++中与C语言兼容的数据结构,确保了C++与C库之间的安全操作。POD类型允许字节赋值,支持静态初始化,并具有简单的内存布局。一个类类型被认为是POD,需要满足trivial和标准布局的要求,如没有虚函数、默认构造函数等。在C++中,可以使用is_pod::value来检查类型是否为POD。
摘要由CSDN通过智能技术生成

C++ POD类型

背景

POD(Plain Old Data)指的是C++定义的和C相兼容的数据结构。

几乎所有的系统底层都是用C写的,当时定义的基本数据类型比如int、char、float、枚举、指针、数组和结构等通过二进制拷贝后还能保持数据不变,即编译器可以通过二进制数据将该类型正确解析出来。C++中的类类型引入了继承和派生等新概念,编译器无法解析这些复杂数据结构,因此C++提出POD数据结构的概念用于兼容C语言,由于C++中基本内置类型都是POD类型,因此我们一般讨论classstructunion是否是POD类型的。

POD类型的优势

1. C内存布局兼容

POD类型兼容C内存布局,C++可以直接使用C库函数操作POD数据类型,POD类型在C和C++间的操作总是安全的。

2. 可以使用字节赋值

POD类型可以直接使用字节赋值,使用C语言库函数进行二进制形式的数据交换,包括但不限于如下操作:

  • malloc创建

  • memset设置内存

  • memcpymemmove拷贝内存

3. 保证静态初始化的安全有效

静态初始化在很多时候可以提高程序性能,而POD类型的静态初始化非常简单(放入目标文件的.bss段,在初始化时直接赋0)

4. 其他特性
  • 虽然与C完全兼容,但是仍然可以有成员函数

  • 有更长的生命周期(从资源获取到资源释放),非POD类型的生命周期从构造函数结束到析构函数结束

  • POD类型对象的前部没有填充字节,因此对象指针等于对象第一个成员的指针

POD类型判断

在C++中,可以通过is_pod<T>::value来判断某个类型是否是POD类型。

POD类型的具体要求如下(这里只讨论类类型,即classstructunion):

1. trival

一个类类型是trival的需要满足如下条件:

默认指的是编译器自动生成的版本,用户定义的拷贝控制操作即使函数体为空也不算trival的,C++11以后可以使用=default显式使用编译器自动生成的版本。

  • 默认的构造函数与析构函数

  • 默认的拷贝构造函数和移动构造函数

  • 默认的拷贝赋值运算符和移动赋值运算符

  • 不能包含虚函数和虚基类

2. 标准布局
  • 所有非静态数据均为标准布局类型

  • 所有基类均为标准布局类型

  • 所有非静态成员具有相同的访问权限

  • 没有虚函数

  • 没有虚基类

  • 类中的第一个非静态成员与其任何基类的类型不同

  • 要么所有基类都没有非静态成员,要么最下层的子类没有非静态成员且最多只有基类有非静态数据成员(总之继承树中最多只能有一个类有非静态数据成员)

Reference

[1] https://zhuanlan.zhihu.com/p/45545035

[2] https://blog.csdn.net/kongkongkkk/article/details/77414410

[3] https://www.cnblogs.com/jerry-fuyi/archive/2020/05/09/12854248.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值