POD資料型別

2021-06-25 13:42:41 字數 1674 閱讀 3894

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