C 11新特性之POD型別

2021-08-20 09:40:36 字數 1447 閱讀 4062

pod(plain old data)是c++中非常重要的乙個概念,用來描述乙個型別的屬性其中plain表示這個型別是個平凡的型別,old表示其與c的相容性。c++11中將pod劃分為兩個基本概念:平凡的(trival)和標準布局(standardlayout)。

什麼是平凡性呢?通常乙個平凡的類或者結構體具有以4點下特徵:

1.      具有平凡的預設建構函式。如果我們不自己為類定義任何建構函式,編譯器就會為我們產生乙個平凡的預設建構函式;一旦我們為類定義了任何一種建構函式,那這個建構函式就不是平凡的。

2.      具有平凡的拷貝建構函式和移動建構函式。即擁有編譯器自動生成的拷貝、移動建構函式。

3.      擁有平凡的拷貝賦值運算子和移動賦值運算子。

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

c++11提供了乙個類模板來幫我們識別乙個類是否是平凡的:

template struct std::is_trival
#include using namespace std;

class base

;int main()

;class b2{};

class d1: public b1

;class d2: public b1

;

b1和b2兩個基類中不包含任何資料成員,b1的子類d1中的第乙個非靜態成員的型別和其基類相同,b1的子類d2中第乙個非靜態成員變數的型別是b2,與其基類並不相同。由於b1和b2都不包含任何資料成員,這樣看起來d1和d2兩個類的類物件占用的記憶體空間應該是一樣的。但實際則不然,在c++標準中,如果基類沒有任何資料成員,基類應不占用空間,為了體現這一點,c++標準允許派生類的第乙個成員與基類共享同一位址空間。但是如果派生類的第乙個非靜態成員的型別和基類相同,由於c++標準要求相同型別的物件的位址必須不相同,編譯器就會為基類分派乙個位元組的位址空間。所以在此例中,d1和d2的記憶體布局其實是不相同的,請看下圖:

4.      沒有虛函式和虛基類。

5.      所有非靜態成員都符合標準布局型別,其父類也符合標準布局。

c++11提供了如下模板來判斷乙個類或結構體物件是否是標準布局

template structstd::is_standard_layout; //標頭檔案為
template struct std::is_pod //判斷乙個型別是否是pod,標頭檔案為
pod的好處:

1 位元組賦值,我們可以放心的使用memset和memcpy對pod型別進行初始化和拷貝。

2 提供對c記憶體的相容。pod型別的資料在c與c++間的操作總是安全的。

3 保證了靜態初始化的安全有效。pod型別的物件初始化往往更簡單

C 11新特性之 nullptr

我們知道在程式設計的世界裡,0有雙重的角色,可以表示整數零,也可以表示乙個空指標。在c語言中,通過預編譯巨集null,可以區分0表示的是零還是 void 0.但是,在c 的世界中,這樣是不可以的。c 中允許函式過載。例如 void foo char void foo int 如果把null定義為0,...

c 11新特性之auto

在早期版本中,auto關鍵字用來宣告具有自動儲存器的區域性變數,auto關鍵字很少被使用,除了靜態變數之外,其它的變數預設是auto的。因此,在c 11中,刪除了原有的功能,並對其重新設計,增加了auto的型別推導功能。template double add t1 a,t2 b int main i...

C 11 新特性之 lambda

這是c 11新特性介紹的第三部分,涉及到c 11這次更新中較為重要的lambda表示式。不想看toy code的讀者可以直接拉到文章最後看這部分的總結。熟悉python的程式設計師應該對lambda不陌生。簡單來說,lambda就是乙個匿名的可呼叫 塊。在c 11新標準中,lambda具有如下格式 ...