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, "Must be POD"); static_assert(std::is_trivially_copyable<PODType>::value, "Trivially copyable"); static_assert(std::is_standard_layout<PODType>::value, "Standard layout");
主な特徴:
プライベートメンバーを持つPOD型を作成できますか?
いいえ、standard-layoutはすべてのメンバーがpublicであるか、一貫したアクセス(すべてpublicまたはすべてprivate/protected)を要求します。
本体がないユーザー定義コンストラクタを持つクラスはPOD型になりますか?
いいえ、ユーザー定義の(たとえ空でも)コンストラクタが存在すると、その型はPODでもトリビアルでもなくなります。
仮想デストラクタまたは仮想関数を持つPOD型を使用できますか?
いいえ、仮想メソッドは型をPODおよびstandard-layoutではなくします。
ネガティブケース
開発者がmemcpyを介して構造体をシリアル化し、その中にstd::string(PODでない)が追加されたことに気づかず、読み込み時にデータが無効になります。
利点:
欠点:
ポジティブケース
構造体全体がPODまたはtrivalで、シリアル化はmemcpyを介して行い、内部に参照やstdコンテナは含まれません。
利点:
欠点: