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...