一般化されたプレーンな古いデータ

P lain O ldD ata (POD) は C 標準レイアウトに従います。したがって、高速な C 関数 memcopy、memmove、memset、または memcmp を直接適用できます。

ポッド

POD は、ブール値、浮動小数点数の整数などの古典的な C++ 基本型です。この制限は C++11 には当てはまりません。 C++11 では、クラスや構造体も POD にすることができます。簡単にするために、クラスについてのみ説明します。

C++11 クラスを POD にするために必要な要件はどれですか? クラスは POD です。それが些細なものであれば、標準のレイアウトがあり、その非静的メンバーはすべて POD です。 定義はかなり簡潔です。しかし、クラスが自明であり、標準的なレイアウトを持つべきであるとはどういう意味でしょうか?

現在、標準はドイツの法律文書のようになっています。

簡単なクラス

  • 単純なデフォルト コンストラクタがあります。
  • 簡単にコピーできます。

自明にコピー可能なクラスは

  • 重要なコピー コンストラクターやムーブ コンストラクターはありません。
  • 重要なコピーまたは移動代入演算子はありません。
  • 簡単なデストラクタがあります。

自明ではないということは、前述のメソッドが開発者によって実装されていることを意味します。メソッドがキーワード default を介してコンパイラから要求された場合、またはコンパイラから自動的に生成された場合、そのメソッドは自明です。

POD の定義は、標準レイアウトに続きます。

標準レイアウト

ない場合、クラスには標準レイアウトがあります

  • 仮想関数。
  • 仮想基本クラス。
  • 参照。
  • 異なるアクセス指定子 (public、protected、private)

クラスが POD の場合、型特性ライブラリの助けを借りて確認する方がはるかに簡単です。

type-traits ライブラリを使用した型のチェック

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// pod.cpp

#include <iostream>
#include <type_traits>

struct Pod{
 int a;
};

struct NotPod{
 int i;
 private:
 int j;
};

int main(){

 std::cout << std::boolalpha << std::endl;
 
 std::cout << "std::is_pod<Pod>::value: " << std::is_pod<Pod>::value << std::endl;
 std::cout << "std::is_pod<NotPod>::value: " << std::is_pod<NotPod>::value << std::endl;
 
 std::cout << std::endl;
 
 std::cout << "std::is_trivial<NotPod>::value: " << std::is_trivial<NotPod>::value << std::endl;
 std::cout << "std::is_standard_layout<NotPod>::value: " << std::is_standard_layout<NotPod>::value << std::endl;
 
 std::cout << std::endl;
 
}

行 6 ~ 8 のクラス Pod は POD ですが、クラス NotPod ではありません (行 10 ~ 15)。型特性ライブラリの関数 std::is_pod (行 21 ~ 22) の助けを借りて、非常に簡単に答えを得ることができます。しかし、type-traits ライブラリを使えばもっとうまくやれます。 26 行目と 27 行目で、クラス NotPod をさらに分析します。結果は次のとおりです。NotPod は自明ですが、標準のレイアウトはありません。変数 i が public であるため、NotPod には標準のレイアウトがありません。反対に、変数 j は非公開です。

プログラムの出力に説明が表示されます。

次は?

この投稿で、パフォーマンスの観点から非常に重要な C++ の機能に関する一連の投稿を終了します。次の記事では、リソースの慎重な取り扱いに関する記事をブログに続けます。組み込み開発ではメモリ管理が優先されます。したがって、C++11 が新しいスマート ポインター std::shared_ptr、std::unique_ptr、および std::weak_ptr を持ち、new による手動のメモリ管理がほとんど不要になることは非常によく適合します。