c 11的pod型別及標準布局(standard layout)是什麼概念?有什麼作用?

時間 2021-05-08 01:23:52

1樓:一根筋的傻瓜

POD,全稱plain old data,plain代表它是乙個普通型別,old代表它可以與c相容,可以使用比如memcpy()這類c中最原始函式進行操作。C++11中把POD分為了兩個基本概念的集合,即:平凡的(trival)和標準布局的(standard layout)。

首先是平凡的(trival)定義,通常乙個平凡的類或者結構體需要滿足以下定義:

擁有平凡的預設建構函式和析構函式。預設的意思就是由編譯器為我們自動生成的,不許是我們自己定義的,但是由於c++11提供了default,也可以是自己定義的加=default,比如

struct Trival=default;

}就是滿足這個要求的,而

struct noTrival;

就不滿足這個要求(哪怕我們定義的建構函式體裡面啥都沒有)。這個要求對於帶參的建構函式沒有束縛。你可以自定義帶參的建構函式。

擁有平凡的拷貝建構函式和移動建構函式。預設的意思同上,也可以使用=default。擁有平凡的拷貝賦值操作符和移動賦值操作符。

不能包含虛函式和虛基類。

2.接下來是標準布局的定義:

所有非靜態成員擁有相同的訪問級別,(訪問級別就是public,private,protected),

struct t1就不滿足標準布局,因為a,b訪問級別不同。

在類和結構體繼承時需要滿足以下兩個情況之一:派生類中有非靜態類,那麼這個派生類只能有且只有乙個僅包含了靜態成員的基類。

基類有非靜態成員,那麼派生類中不允許有非靜態成員。

這兩句話看著挺繞口,其實就是在說明乙個事實,關於非靜態資料的事實,派生類中有非靜態的資料那麼它的基類只能是只有靜態的,而且基類只能有乙個。如果基類有非靜態的, 那麼派生類就不能有非靜態的。有種蹺蹺板的感覺,非靜態的對面坐著的是靜態,父子類就是坐在蹺蹺板的兩端這種對應關係。

類中第乙個非靜態型別與基類不是同乙個型別。比如struct A:B就不符合這個條件。因為A中第乙個成員是基類B型別的。

沒有虛類和虛基類(與trival中重複)所有非靜態資料成員都符合標準布局的要求,這其實就是乙個遞迴的定義。所以在C++11中,POD就是滿足平凡的(trival)和標準布局(standard layout)這兩個方面。可以使用中的is_pod::

value判斷T是不是POD型別的。

說了這麼多,那麼為什麼我們需要POD這種條件滿足的資料呢?

可以使用位元組賦值,比如memset,memcpy操作對C記憶體布局相容。保證了靜態初始化的安全有效。

2樓:藍色

C++11已經不談POD了,談的是Trival和Standard Layout了,具體的內容可以參考我這乙個回答,這裡面我詳細解釋了POD,Trival等:如何看待VS與cpluscplus.com中is_pod示例的不同輸出?

- 藍色的回答

而至於Standard Layout的作用主要在於與其它語言進行互動,對於C++的struct/union等的Standard Layout來說,它的布局將會和C語言中的struct/union等一致。

為什麼 C 11 標準不加入 GC 功能呢?

c 總有一天會有的,既然他老爸說程式設計師都很聰明讓他們控制,那gc早晚一天會加進去,因為程式設計師很聰明,會自己用。你用不好或者用出問題來都是你不夠聰明。 徐辰 你還真不能說C 拒絕GC,事實情況是,有那麼多種GC演算法,你說加哪種好呢?顯見C 標準委員會的人都有選擇恐懼症,最後他們基本達成的協議...

如何評價C11標準終於引入了微軟試圖推廣的 s系列安全函式?

tearshark 因為微軟被搞怕了,包括緩衝區溢位的問題,以及dll查詢邏輯帶來的安全問題,以及dll查詢邏輯帶來的發布問題。這些函式還是很有用的,至少讓新手去思考這個問題。至於那些搬linus的人省省吧。不要把這個人神話了。就Linux的現狀來看,落後Windows架構是板上釘釘的事了。然後還不...

C 11中能否顯式宣告乙個lambda型別的變數,而不用auto

所以,不存在符合標準的 不利用編譯器內部實現特徵 的顯式宣告lambda型變數的方法,是這樣嗎?是。你可以寫個程式,用 typeid 列印出型別的名字看一下。include include template T void printType T obj intmain printType print...