C++ 什么是POD?
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内存的兼容。
-
可以保证静态初始化的安全有效。