何為POD物件?

2021-08-24 18:59:06 字數 1624 閱讀 5245

在c++中,我們把傳統的c風格的struct叫做pod(plain old data)物件。一般來說,pod物件應該滿足如下特性。

對於pod型別t的物件,不管這個物件是否擁有型別t的有效值,如果將該物件的底層位元組序列複製到乙個字元陣列(或者無符號字元陣列)中,再將其複製回物件,那麼該物件的值與原始值一樣。

對於任意的pod型別t,如果兩個t指標分別指向兩個不同的物件obj1和obj2,如果用memcpy庫函式把obj1的值複製到obj2,那麼obj2將擁有與obj1相同的值。

簡言之,針對pod物件,其二進位制內容是可以隨便複製的,在任何地方,只要其二進位制內容在,就能還原出正確無誤的pod物件。對於任何pod物件,都可以使用memset()函式或者其他類似的記憶體初始化函式。

現在動手

為了更好地理解pod物件的含義,我們體驗一下如何採用mem***()函式對pod物件進行儲存與還原。

編寫win32控制台程式,主程式如下:

【程式 4-3】使用mem***函式操作pod物件

01#include"stdafx.h"

02#include

03 04//person為pod

05structperson

06;

11 12voidprint(person*p)

13 16

17intmain()

18;

21personp3=;

22print(&p1);

23print(&p3);

24 25//將p1轉儲為char陣列

26charbytes[sizeof(person)];

27memcpy(bytes,&p1,sizeof(person));

28 29personp2;

30memset(&p2,0,sizeof(person));

31print(&p2);

32 33//將char陣列還原為p2

34memcpy(&p2,bytes,sizeof(person));

35print(&p2);

36 37//將p3複製至p2

38memcpy(&p2,&p3,sizeof(person));

39print(&p2);

40 41return0;42}

結果輸出如圖4-5所示。

因此,對於pod物件,我們完全可以大膽地使用mem***函式進行操作,從而完成對物件複製、賦值的目的。但是注意,對於多型類的物件,要慎重考慮使用memset,因為它會同時修改vtable指標!vtable指標是多型的根本所在,弄亂了物件的虛表指標,很有可能會釀成大錯。

以上摘自《把脈vc++》

如果你想與我交流,如下鏈結加我為好友:

何為物件導向?

概述 所謂物件,是乙個名詞,任何乙個事物都可以稱為物件,其有對應的屬性 事物的特性 和行為 事物能幹什麼 物件導向思想,就是面向事物的程式設計思想。1,面向過程 談及物件導向,不得不談的就是面向過程。物件導向是針對名詞而言,面向過程則是針對行為動作的處理。面向過程是一種以過程為中心的程式設計思想。所...

深入解析Pod物件

kubectl get pods 檢視預設ns內的pod kubectl get pods n ns 檢視指定ns內的pod kubectl get pods o wide kubectl get pods o yaml kubectl exec it mypod bin sh kubectl ex...

物件導向何為多型?

前言 物件導向程式設計過程中少不了 1 封裝 2 繼承 3 多型 三個特性,其中多型又是怎麼理解的呢?擯棄教科書式回答,多型語義是多種形態的縮寫,在物件導向程式設計的思想中,萬物皆物件 那麼我們知道,物件的行為和屬性由模板類定義,而通過模板類 class or inte ce 我們可以控制物件在ru...