C++ 什么是POD?

Share on:
100 Words | Read in about 1 Min | View times

Overview

为了兼容C内存的数据类型,C++11提出了POD的概念。什么是POD类型,POD类型有什么作用,本节内容将一一揭晓。

本系列文章将包括以下领域:

本章其他内容请见 《现代C++》

什么是POD类型?

POD, Plain Old Data, 是C++11引入的一类数据结构的概念,是指能用C语言的memcpy()函数进行操作的类或结构体。其中的Plain代表这个类型是平凡的(trivial),Old代表与C语言兼容。

POD类型需要满足2个条件:平凡性和标准布局。

平凡性

一个类型具有平凡性,需要满足以下几个特点:

  • 具有平凡的默认构造函数、析构函数、拷贝构造函数和移动构造函数,即不能自定义这些构造函数或析构函数,只能由编译器自动生成。可以不写,或者只能使用default关键字定义。

  • 具有平凡的拷贝/移动运算符。

  • 不含虚函数和虚基类。

标准布局

一个类型具有标准布局,需要满足以下几个特点:

  • 所有非静态成员具有相同的访问级别。

  • 继承结构中最多只能有一个类拥有非静态成员。即派生类中有非静态成员,且只有仅包含静态成员的基类;或者基类有非静态成员,而派生类中没有非静态成员。

  • 类中第一个非静态成员与其基类不同。

  • 不含虚函数和虚基类。

  • 所有非静态成员符合标准布局,父类也符合标准布局。

<type_traits>中的判断方法

C++11的<type_traits>中提供了以下方法来判断POD:

  • std::is_trivial<T>::value: 判断是否平凡。

  • std::is_standard_layout<T>: 判断是否标准布局。

  • std::is_pod<T>: 判断是否POD类型。

POD类型有什么作用?

  • 可以放心地使用memcpy()、memset()等函数对POD类型进行拷贝和赋值。

  • 可以提供对C内存的兼容。

  • 可以保证静态初始化的安全有效。

Next Post: 『C++引用、指针、迭代器的区别?』