c 聚合 POD 平凡 標準布局 介紹

2022-09-21 20:00:28 字數 2791 閱讀 9537

目錄平凡可複製(trivialcopyable)

標準布局型別(standard-layout type)

標準布局相容

例子總結

引用部落格

因為要整理近期學習的c++特性,特地出一篇來介紹pod型別和c++11引進的trivialstandard-layout

聚合是以下型別之一:

沒有使用者宣告的建構函式

(直到 c++11)

沒有使用者提供的建構函式(允許顯式預設或刪除的建構函式)

(c++11 起) (c++17 前)

沒有使用者提供的、繼承的或顯式(explicit,c++17特意新加)的建構函式(允許顯式預設或刪除的建構函式)

(c++17 起) (c++20 前)

沒有使用者宣告或繼承的建構函式(相當於=default不行了)

(c++20 起)

沒有預設的成員初始化器

(c++11 起) (c++14 前)

聚合初始化。它是列表初始化 (c++11 起)或直接初始化 (c++20 起)的一種形式

pod規範著物件的型別,主要是為了相容c,c++可以直接使用c庫函式操作pod資料型別,擁有pod特徵的類或結構體通過直接位元組拷貝或二進位制拷貝後依然能保持資料結構不變,pod型別在c和c++間的操作總是安全的。

特徵:特性:

來自cppreference:podtype

要求來自cppreference:trivialtype

要求以下型別統稱為平凡可複製型別

這裡有很多平凡的概念,但大致如下

平凡可複製物件 的陣列

這意味著乙個平凡可複製的類沒有虛函式或虛基類。

來自cppreference:triviallycopyable

使用is_trivially_copyable(c++11)可判斷型別是否是平凡可複製的

std::is_trivially_copyable
對於某些函式的補充說明

平凡拷貝建構函式

平凡可複製物件可以通過手動複製其物件表示來複製,例如使用std::memmove。所有與 c 語言相容的資料型別(pod 型別)都可以輕鬆複製。

符合條件的移動建構函式

平凡移動建構函式是執行與普通拷貝建構函式相同的操作的建構函式,也就是說,就像通過std::memmove一樣製作物件表示的副本。所有與 c 語言相容的資料型別(pod 型別)都可以輕鬆移動。

符合條件的拷貝賦值運算子

平凡拷貝賦值運算子生成物件表示的副本,就像通過std::memmove一樣。所有與 c 語言相容的資料型別(pod 型別)都可以簡單地拷貝分配。

符合條件的移動賦值運算子

平凡移動賦值運算子執行與平凡拷貝賦值運算子相同的操作,即生成物件表示的副本,就像std::memmove一樣。所有與c語言相容的資料型別(pod型別)都可以簡單地移動賦值。

符合條件的析構函式

平凡析構函式是不執行任何操作的析構函式。具有普通析構函式的物件不需要刪除表示式,並且可以通過簡單地釋放它們的儲存來處理。所有與 c 語言相容的資料型別(pod 型別)都可以輕鬆破壞。

標準布局規範著對物件的布局。標準布局型別對於與用其他程式語言編寫的**進行通訊很有用。

當類或結構不包含某些c++語言功能(例如無法在c語言中找到虛函式),並且所有成員都具有相同的訪問控制時,該類或結構為標準布局型別。可以在記憶體中對其進行複製,並且布局已經充分定義,可以由c程式使用。標準布局類具有使用者定義的特殊成員函式。此外有以下特徵

舉兩個例子,base類和derived類中都有非靜態資料成員,因為當derived繼承於base,有std::is_standard_layout為falsestd::is_standard_layout為true

struct base

;// std::is_standard_layout== false!

struct derived : public base

;

derived 是標準布局,因為 base 沒有非靜態資料成員:

struct base

};// std::is_standard_layout<== true

struct derived : public base

;

涉及兩個或兩個以上滿足標準布局的資料結構相容問題,概括起來有點複雜,先直接拋cppreference鏈結看吧(後續再細看),在標準布局內容下邊

類a滿足pod型別要求,即可直接通過位元組拷貝 拷貝其資料,在此情形下,位元組拷貝效率是很快的

class a

;int main()

pod概念在c98中被提出,在c++20被啟用,取而代之的是在c++11引入的trivialstandard-layout型別,因本文所介紹內容在《深度探索c++物件模型》中會被重點介紹,待後續閱讀完此書籍後,再對本文進行更多補充

聚合型別與pod型別

c++中的pod型別

《深度探索c++物件模型》

c 標準庫介紹

c 標準庫的所有標頭檔案都沒有副檔名。c 標準庫的內容總共在50個標準標頭檔案中定義,其中18個提供了c庫的功能。形式的標準標頭檔案 例外 其內容與iso標準c包含的name.h標頭檔案相同,但容納了c 擴充套件的功能。在形式標準的標頭檔案中,與巨集相關的名稱在全域性作用域中定義,其他名稱在std命...

C 標準庫簡單介紹

c 標準庫簡單介紹 c 標準庫的所有標頭檔案都沒有副檔名。c 標準庫的內容總共在50個標準標頭檔案中定義,其中18個提供了c庫的功能。形式的標準標頭檔案 例外 其內容與iso標準c包含的name.h標頭檔案相同,但容納了c 擴充套件的功能。在 形式標準的標頭檔案中,與巨集相關的名稱在全域性作用域中定...

C 標準模板庫介紹

setstring mapqueue priority queue priority queue常見的用途 stack pair vector vi 100 vectorvi 區別可以理解成乙個是乙個一維長度已經固定,乙個是可變的 1 通過下邊 2 通過迭代器 vector iterator it ...