什麼是 POD 資料型別?

2021-10-11 00:12:08 字數 1637 閱讀 1124

本節內容主要講 pod 這個概念。先說明為什麼會出現這個概念,然後列舉了具備 pod 特徵的類、結構體應該具有什麼特點,最後乙個小例子說明如何使用 pod 資料。因為寫容器的時候涉及到這個概念,所以作為預備知識先寫了本文。
很久很久以前,c 語言統一了江湖。幾乎所有的系統底層都是用 c 寫的,當時定義的基本資料型別有 int、char、float 等整數型別、浮點型別、列舉、void、指標、陣列、結構等等。然後只要碰到一串 01010110010 之類的資料,編譯器都可以正確的把它解析出來。

那麼到了 c++ 誕生之後,出現了繼承、派生這樣新的概念,於是就誕生了一些新的資料結構。比如某個派生類,c 語言中哪有派生的概念啊,遇到這種資料編譯器就不認識了。可是我們的計算機世界裡,主要的系統還是用 c 寫的啊,為了和舊的 c 資料相相容,c++ 就提出了 pod 資料結構概念。

pod 是 plain old data 的縮寫,是 c++ 定義的一類資料結構概念,比如 int、float 等都是 pod 型別的。plain 代表它是乙個普通型別,old 代表它是舊的,與幾十年前的 c 語言相容,那麼就意味著可以使用 memcpy() 這種最原始的函式進行操作。兩個系統進行交換資料,如果沒有辦法對資料進行語義檢查和解釋,那就只能以非常底層的資料形式進行互動,而擁有 pod 特徵的類或者結構體通過二進位制拷貝後依然能保持資料結構不變。也就是說,能用 c 的 memcpy() 等函式進行操作的類、結構體就是 pod 型別的資料

基本上談到這個概念,一般都是說某某 class、struct、union 是不是 pod 型別的。

是不是 pod 型別的,可以用 is_pod::value 來判斷。那什麼樣的類、結構體是擁有 pod 特性的呢?要求有兩個:乙個是它必須很平凡、很普通;另乙個是布局有序。

能平凡就平凡

trival(平凡)是個概念,我也暫時找不到特別合適的翻譯,滿足以下條件即可:

你看,a 類手寫了個建構函式,雖然什麼都沒填,但這建構函式已經不是編譯器預設提供的了,所以不平凡,所以就不是 pod 類,自然就不能用諸如 memcpy() 這種 c 語言的函式來操作;b 類的一堆建構函式啥的都沒寫,預設由編譯器提供,所以是平凡的;c 類雖然寫了建構函式,但用了 c++11 的 default 關鍵字修飾,也是平凡的。

布局要有序

除了平凡之外,還對布局有要求。為了便於理解講述,我們把非靜態資料稱為普通資料。

前面既然說了,具有 pod 性質的資料可以使用 c 語言中的 memcpy() 等底層函式,那我們來看看怎麼用。

POD資料型別

pod全稱plain old data 資料型別滿足了 平凡的定義 和 標準布局 通俗的講,乙個類或結構體通過二進位制拷貝後還能保持其資料不變,那麼它就是乙個pod型別。平凡的定義 1.有平凡的建構函式 2.有平凡的拷貝建構函式 3.有平凡的移動建構函式 4.有平凡的拷貝賦值運算子 5.有平凡的移動...

理解POD資料型別

pod全稱plain old data。字面意思,普通的,舊的資料型別。通俗的講,乙個類或結構體通過二進位制拷貝後還能保持其資料不變,那麼它就是乙個pod型別。在維基百科中有 c 中的普通舊資料結構是乙個聚合類,它只包含pds作為成員,沒有使用者定義的析構函式,沒有使用者定義的複製賦值運算子,也沒有...

什麼是資料型別?

宣告 師從老男孩太白金星,不對 做任何保證,如有問題請自攜兵刃直奔沙河 什麼是資料型別?我們人類可以很容易的分清數字與字元的區別,但是計算機並不能呀,計算機雖然很強大,但從某種角度上看又很傻,除非你明確的告訴它,1是數字,漢 是文字,否則它是分不清1和 漢 的區別的,因此,在每個程式語言裡都會有乙個...