POD类型是C++中具有C风格内存布局、可安全memcpy拷贝的平凡且标准布局类型;需同时满足平凡类型(无用户自定义构造/析构/拷贝)和标准布局(无虚函数、访问控制一致、无多重非静态成员继承)两个条件。
POD(Plain Old Data)类型是C++中一类具有C语
言风格内存布局的类型,它的核心特点是:可以像C结构体一样被直接复制、初始化和布局,不涉及构造、析构、虚函数、访问控制等C++特有机制。简单说,POD就是“能用memcpy安全拷贝、能用memset清零、能用C API直接读写的类型”。
一个类型要成为POD,必须同时满足以下两点(C++11起定义):
以下都是POD:
int、double、char* 等内置类型struct Point { int x; int y; };(无函数、无private、无继承)union U { int a; float b; };(满足标准布局且平凡)struct Rect { Point p1; Point p2; };
一旦引入C++语义增强,就容易脱离POD:
struct S { int x; S() {} }; → 非平凡(用户定义构造函数)struct S { private: int x; }; → 非标准布局(成员访问控制不一致或存在private)struct Base { virtual ~Base() = default; }; struct D : Base {}; → 含虚函数表,破坏标准布局与平凡性struct S { std::string s; }; → std::string本身非POD(含构造、析构、动态内存)POD类型直接影响编译器如何生成和处理对象:
reinterpret_cast和memcpy:比如将struct Packet(POD)直接映射到网络缓冲区首地址,或序列化到文件struct tm*或sockaddr_in*,它们都是POD;C++代码传入POD对象指针可直接对接{}聚合初始化,且全局POD变量可在编译期完成零初始化,无需运行时构造函数调用不复杂但容易忽略:判断是否POD,最可靠方式是查std::is_pod_v(C++17已弃用,推荐用std::is_trivial_v),而不是凭直觉——哪怕只加一个private:或空构造函数,就不再是POD。