前言
POD是何物,就是能否兼容C格式。
一、POD概念
相信很多人都遇到过说是非pod类型不能用memset和memcopy。会有问题。为什么会有问题呢。因为这些函数本身即使C语言使用的。因此所谓POD,就是考量能否正确匹配C的格式。因此专家们把C++和C的不同点列出,整理了两个要求。
1. 是否是平凡的。
这个很好理解,即默认的函数都是默认,没有显示定义。(默认构造,默认拷贝构造,默认移动构造,默认赋值,默认移动赋值,默认析构,6个函数都没有使用)。没有显示指定6个默认函数,他就是平凡的。可以理解吗,C语言有这些东西吗,没有。
是否平凡还会影响空间分配,我之前有文章分析过,stl里空间分配时将空间的分配和初始化分开操作。因此如果一个类/结构体是平凡的,就不需要调用~class其析构函数。这也是为什么很多编程规范里要求没有使用就不要显示定义默认的函数,因为会影响效率。
2. 是否是标准布局
这个理解有难度。暂时背下。第5,6个规则暂时不理解。等待日后-----。
- 所有非静态成员作用域内访问权限一致。
这个很好理解,C本来就是全是公有的,只有一种访问方式,当类/结构体里边既有私有又有共有时,显然两者空间分配会不同。 - 派生类的第一个定义类型不能是基类的类型。
第一个类型不是基类对象时,基类并不占用空间(c++标准中允许基类和第一个变量共享空间)。当第一个是基类时,会有一个字节标识基类。(因为c++标准要求类型相同的对象地址不同) - 没有虚函数,虚基类
这个也很好理解,一旦有虚的东西,就需要4个字节的头,虚函数列表的存在,和C的空间构造肯定不同。 - 派生类中有非静态类型成员且只有一个仅包含静态成员的基类
- 基类有非静态成员,派生类没有静态成员。
总结。
其实也不需要全部理解。本着最原始的需求就可以。再c++上定义的这个代码,拿到C里能不能跑。能就是POD类型。不能就是非POD类型。