c/c++ pod类型介绍

一、啥是pod类型

pod:plain old data,是 C++ 定义的一类数据结构概念,比如 int、float 等都是 POD 类型的。Plain 代表它是一个普通类型,Old 代表它是旧的,与几十年前的 C 语言兼容,那么就意味着可以使用 memcpy() 这种最原始的函数进行操作。

基本上谈到这个概念,一般都是说某某 class、struct、union 是不是 POD 类型的。

二、pod的特征

要求有两个:一个是它必须很平凡、很普通;另一个是布局有序。

  1. 平凡数据类型
    • 拥有平凡的默认构造函数和析构函数
      这里平凡默认构造函数和平凡析构函数指的是系统生成的默认构造函数和析构函数。
      如果,在定义类的时候显式的声明了构造函数或析构函数,即使什么都不干,那么该方法就不再是“平凡”的。

    • 拥有平凡的拷贝构造函数和移动构造函数(同 1)

    • 拥有平凡的拷贝赋值运算和移动赋值运算符(原理同 1 )

    • 不能包含虚函数以及虚基类

    • 通过is_trivial判断是否为平凡数据

  2. 标准布局
    • 所有非静态成员有相同的访问权限(所有非静态成员必须属于public\private\protected其中之一)

    • 在类或者结构体继承时,需要满足:

      • 派生类中有非静态成员,且只有一个仅包含静态成员的基类
      • 基类有非静态成员,而派生类没有非静态成员
    • 类中第一个非静态成员的类型与其基类不同

    • 没有虚函数和虚基类

    • 所有非静态数据成员均扶额标准布局类型,其基类也符合标准布局。

struct A : B{B b;};           //不是标准布局类型
struct C : B{int a ; B b;};   //是标准布局类型
  1. POD数据

当自定义数据类型同时满足平凡类型和标准型,就认为该数据类型为POD数据。

判断是否POD:


typedef <typename T> struct std::is_pod;

cout << is_pod<U>::value <<endl;

三、pod作用

  1. 字节复制,我们可以很安全的使用memset和memcpy对POD进行初始化
  2. 提供对C内存布局兼容
  3. 保证静态初始化的安全有效

四、std::vector是pod吗?

c/c++ pod类型介绍_第1张图片

参考

  1. pod类型
  2. 什么是 POD 数据类型?
  3. c++中 为什么数组不能被vector完全替代?

你可能感兴趣的:(c/c++)