书中72~73页第一次提到POD型别,“POD意指Plain Old Data,也就是标量型别(scalar types)或传统的C struct型别。POD型别必然拥有trivial ctor/dtor/copy/assignment 函数。”
万脸懵逼?!啥?
查了一下单词,这个trivial的意思是 不重要的,琐碎的,微不足道的。而构造函数ctor,复制构造函数copy,赋值函数assignment,析构函数dtor,这些显然都是必需品呀,为啥不重要?再查了查,还有无意义的意思,而non-trivial表示有意义的。
翻看了一些博客,这里这个trivial本质上是指默认函数(default),也就是那些我们没有定义的默认构造函数、析构函数等,例如:
#include <iostream>
using namespace std;
class A
{
private:
int x, y;
public:
void show() const { cout << x << " " << y << endl; }
};
int main()
{
A lala;// ctor
lala.show();
A haha = lala; // copy
haha.show();
A aaaa;
aaaa = haha; // assignment
aaaa.show();
return 0;
}
所以这里这个类A就应该是POD型别啦!但是!
翻阅到书325页,“编译器之中,有能力验证‘用户自定义型别’之型别特性者极少,程序中所有的用户自定义型别,都被编译器视为拥有non-trivial函数,我们得自己动手为它做特性设定,才能保证编译器知道它的身份”。
当编译器知道某个型别为POD型别时,对于这个型别的各种操作,都可以采用最有效率的措施,例如用内存直接处理操作(如malloc()、memcpy()等),使用traits来萃取型别,见书104页。
关于C++POD的详细说明,请参考这位朋友的博客C++POD。
我看到也有博客说POD是C风格的struct结构体定义的数据结构。好像也可以这样理解。