POD(Plain Old Data)是C++中的一种结构或数据类型,与C中的普通数据结构兼容,非常适合低级编程。
问题的历史:
POD起源于C语言,旨在保证C和C++之间的内存兼容性。在C++98中,POD对象有严格的限制,以便可以轻松地按字节复制或直接序列化。
问题:
许多程序员将POD与简单结构混淆,并且没有考虑标准的细微差别,例如聚合规则或存在非标准构造函数,这在ABI兼容性和低级操作(memcpy,序列化)中至关重要。
解决方案:
在现代C++中,从C++11开始引入了trivial、trivially copyable和standard-layout的概念,更明确地划分了要求。
代码示例:
struct PODType { int x; double y; }; static_assert(std::is_pod<PODType>::value, "必须是POD"); static_assert(std::is_trivially_copyable<PODType>::value, "平凡可复制"); static_assert(std::is_standard_layout<PODType>::value, "标准布局");
关键特征:
可以将POD类型的成员设为私有吗?
不可以,标准布局要求所有成员为public,或者统一访问(所有public或所有private/protected)。
如果类中明确定义了一个没有主体的用户定义构造函数,这个类会是POD类型吗?
不会,存在用户定义(即使是空)的构造函数会使类型不是POD以及不平凡。
我可以使用具有虚析构函数或虚方法的POD类型吗?
不可以,虚方法使类型不是POD,也不是标准布局。
负面案例
开发者通过memcpy序列化结构,未注意到在其中添加了std::string(非POD),导致读取时数据不正确。
优点:
缺点:
正面案例
整个结构为POD或平凡,序列化通过memcpy,没有引用和std容器。
优点:
缺点: