理解POD資料型別

2021-08-25 22:05:33 字數 2541 閱讀 8826

pod全稱plain old data。字面意思,普通的,舊的資料型別。通俗的講,乙個類或結構體通過二進位制拷貝後還能保持其資料不變,那麼它就是乙個pod型別。

在維基百科中有:

c ++中的普通舊資料結構是乙個聚合類,它只包含pds作為成員,沒有使用者定義的析構函式,沒有使用者定義的複製賦值運算子,也沒有指向成員型別的非靜態成員。被動資料結構pds(passive data structure,不要與ibm的分割槽資料集混淆;也稱為普通舊資料結構,或普通舊資料pod)),是乙個記錄術語,與物體形成對比。它是一種資料結構,僅表示為字段值(例項變數)的被動集合,而不使用物件導向的功能。

在c++11中pod包含兩個型別trivial(平凡的,普通的) 和 standard-layout(標準布局) 。

trivial型別支援靜態初始化。如果乙個型別是拷貝不變的(trivially copyable),使用memcpy這種方式把它的資料從乙個地方拷貝出來會得到相同的結果。 

c++標準把trivial(平凡的)型別定義如下:

#include #includeusing namespace std;

//空類是平凡的

//以下是平凡的

class trival1 {};

struct trival1_1;

class trival1_2;

///以下是no-trival,不是pod型別

//非平凡的建構函式

class trival2 };

//非平凡的拷貝建構函式

class trival3 };

//非平凡的拷貝賦值運算子

class trival4 };

//非平凡的移動賦值運算子

class trival5 };

//非平凡的析構函式

class trival6 };

//有虛函式---不是trival,不是pod

class trival7 ;

//有虛基類 --- 不是trival,不是pod

c++標準中的是這樣定義的:

standard-layout型別的struct就是以struct或class為關鍵字定義的standard-layout 型別。

standard-layout型別的union就是以union為關鍵字定義的standard-layout 型別。

#include #include//c++11中

//成員a和b具有不同的訪問許可權,不符合標準布局

class a

;class b1

;class b2

;//子類含有非靜態資料成員,

//基類有1個非靜態資料成員,不符合標準布局

class b_1 : b1, b2

;//子類含有靜態資料成員,

//基類有1個非靜態資料成員,符合標準布局

class b_2 : b1,b2

;//第乙個非靜態成員是基類型別,不符合標準布局

class c1 {};

class c_1 : c1

;//第乙個是靜態資料成員的基類型別,符合標準布局

class c_2 : c1

;//有虛函式,不符合標準布局

class d ;

//有虛基類

class e : d {};

//非靜態成員x不符合標準布局型別

當乙個資料型別滿足了trival(平凡)和 standard_layout(標準布局),我們則認為它是乙個pod資料。可以通過std::is_pod來判斷乙個型別是否為pod型別。

#include #include struct a ;            // c型別的結構體 ,是pod

class b : public a {}; // 是pod,沒有資料成員

struct c : b }; // 是pod,有成員函式

struct d : c }; // 不是pod ,有預設的建構函式

POD資料型別

pod全稱plain old data 資料型別滿足了 平凡的定義 和 標準布局 通俗的講,乙個類或結構體通過二進位制拷貝後還能保持其資料不變,那麼它就是乙個pod型別。平凡的定義 1.有平凡的建構函式 2.有平凡的拷貝建構函式 3.有平凡的移動建構函式 4.有平凡的拷貝賦值運算子 5.有平凡的移動...

什麼是 POD 資料型別?

本節內容主要講 pod 這個概念。先說明為什麼會出現這個概念,然後列舉了具備 pod 特徵的類 結構體應該具有什麼特點,最後乙個小例子說明如何使用 pod 資料。因為寫容器的時候涉及到這個概念,所以作為預備知識先寫了本文。很久很久以前,c 語言統一了江湖。幾乎所有的系統底層都是用 c 寫的,當時定義...

C 11 POD資料型別

1.有平凡的建構函式 2.有平凡的拷貝建構函式 3.有平凡的移動建構函式 4.有平凡的拷貝賦值運算子 5.有平凡的移動賦值運算子 6.有平凡的析構函式 7.不能包含虛函式 8.不能包含虛基類 cpp view plain copy include stdafx.h include using nam...