POD (plain old data) type

POD (Plain Old Data)という型がある。PODとは、C言語の構造体とbitレベルで互換性があるデータ構造のことである。ABI (Application Binary Interface)互換性があるともいう。POD型の代表的な用途は、C言語とのバイナリデータのやり取りである。

PODというクラスを継承しているわけではないから、PODは型の型というべきものかもしれない。

任意の型がPOD型かどうかは、std::is_podで調べられる。C++の仕様のバージョンによって、POD型の定義は少し異なる。バージョンが上がるほどPODという言葉は使われなくなっており、C++20では廃止された。

現在では代わりに、trivial typeとstandard layout typeというものがある。両者を兼ね備えるものがPOD型である。

C++11以降では、std::is_podstd::is_trivialstd::is_trivially_copyablestd::is_standard_layoutが使える。このうちis_podはC++20で、deprecatedになった。これら4つは、同じ名前の型かどうかを調べるためのものである。何がPODかの厳密な議論は、細部があって複雑だ。理解を深めたい場合には、これら関数を起点に考えると便利かもしれない。

実用上は恐らく、PODの基本的な要件を守って型を定義し、これら関数で実際にPODにできているか確認すればいい。そのため、PODになるための詳細な条件を知っておく必要はなさそうである。そもそもPODについて考える必要のない場合が多そうである。しかし、定義によってPODでなくなる理由について学ぶことは、C++への理解を深めそうではある。

data structure alignment(データ構造アライメント)という言葉がある。そこにおいては、パッキングとパディングという言葉も使われる。4バイトでpackするとき、1バイトのメンバに対しては3バイトのpaddingが追加される。POD型だとは言っても、アライメントによってバイナリ表現は異なるだろう。しかし実用上は多くの環境で同じ結果が期待できるようだ。またそもそも、endiannessという論点もある。