pod全稱plain old data——資料型別滿足了」平凡的定義「和」標準布局「
通俗的講,乙個類或結構體通過二進位制拷貝後還能保持其資料不變,那麼它就是乙個pod型別。
平凡的定義:
1.有平凡的建構函式
2.有平凡的拷貝建構函式
3.有平凡的移動建構函式
4.有平凡的拷貝賦值運算子
5.有平凡的移動賦值運算子
6.有平凡的析構函式
7.不能包含虛函式
8.不能包含虛基類
標準布局的定義:
1.所有非靜態成員有相同的訪問許可權
2.繼承樹中最多只能有乙個類有非靜態資料成員
3.子類的第乙個非靜態成員不可以是基類型別
4.沒有虛函式
5.沒有虛基類
6.所有非靜態成員都符合標準布局型別
pod到底有什麼好處呢?
1.位元組賦值, **中我們可以安全的使用memset和memcpy函式對pod型別進行初始化和拷貝等操作.
2.提供了對c記憶體布局的相容. c++程式可以與c函式 進行相互的操作, 因為pod型別的資料在c++與c之間的操作總是安全的.
3.保證了靜態初始化的安全有效, 靜態初始化在很多時候能夠提高程式的效能, 而pod型別的物件初始化往往更加簡單(比如放在目標檔案的.bss段 , 在初始化中直接被賦0).
c++11將pod劃分為兩個基本概念的集合(只有滿足這兩個基本概念才能成為是pod型別):
1.平凡的(trivial)
2.標準布局的(standard layout)
乙個trivial class或者struct應該符合以下定義:
1)擁有平凡的預設建構函式(trivial constructor)和析構函式(trivialdestructor).
trivial constructor就是說建構函式什麼都不幹,通常情況下, 不定義類的建構函式, 編譯器就會自動生成乙個trivialconstructor, 而一旦定義了建構函式, 即使建構函式中不包含任何引數, 函式體中也沒有任何**, 那麼該建構函式都不再是trivial的(non-trivial),
2)擁有平凡的複製建構函式(trivial copy constructor)和移動建構函式(trivial move constructor), 同trivial constructor一樣, 不宣告trivial copy constructor的話, 編譯器會自動生成乙個, 同樣也可以顯示的使用 = defualt宣告預設的複製建構函式.
ps: trivial move ctor與trivial copy ctor類似, 只不過適用於move語義
3)擁有平凡的複製賦值運算子(trivial assignment operator)和移動賦值運算子(trivial
move operator). 這些基本上與第二點中說的類似.
4)不能包含虛函式和虛擬基類.
我們可以使用c++11中新提供的一些工具來檢測某個型別是否為trivial的:
template< typename _t > structstd::is_trivial;
我們可以根據is_trivial模板的bool成員value判斷_t是否為乙個trivial型別
具體關於和std::is_trivial等工具的用法可以參考:
pod型別的另乙個概念是標準布局(standard layout).
理解POD資料型別
pod全稱plain old data。字面意思,普通的,舊的資料型別。通俗的講,乙個類或結構體通過二進位制拷貝後還能保持其資料不變,那麼它就是乙個pod型別。在維基百科中有 c 中的普通舊資料結構是乙個聚合類,它只包含pds作為成員,沒有使用者定義的析構函式,沒有使用者定義的複製賦值運算子,也沒有...
什麼是 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...