Loading AI tools
来自维基百科,自由的百科全书
Plain old data structure, 縮寫為POD, 是C++語言的標準中定義的一類數據結構[1],POD適用於需要明確的數據底層操作的系統中。POD通常被用在系統的邊界處,即指不同系統之間只能以底層數據的形式進行交互,系統的高層邏輯不能互相兼容。比如當對象的字段值是從外部數據中構建時,系統還沒有辦法對對象進行語義檢查和解釋,這時就適用POD來存儲數據。
本條目存在以下問題,請協助改善本條目或在討論頁針對議題發表看法。
|
POD類型包括下述C++類型,以及其cv-qualified的類型,還有以其為基類型的數組類型[2]:
術語標量類型包括下述C++類型範疇, 以及其cv-qualified類型[3]:
術語算術類型包括下述C++類型範疇[4]:
術語整數類型包括下述C++類型範疇[5]:
術語浮點類型包括C++的float, double, and long double類型[4].
術語枚舉類型包括各種枚舉類型,即命名的常量值(named constant values)的集合[6].
術語指標類型包括下述C++類型範疇[7]:
術語指標到成員類型包括下述C++類型範疇[7]:
POD類類型是指聚合類(aggregate classes, 即POD-struct types)與聚合union (POD-union types),且不具有下述成員[8]:
術語聚合是指任何的數組或者類,且不具有下述特徵[9]:
可見,POD類類型就是指class、struct、union,且不具有用戶定義的構造函數、析構函數、拷貝算子、賦值算子;不具有繼承關係,因此沒有基類;不具有虛函數,所以就沒有虛表;非靜態數據成員沒有私有或保護屬性的、沒有引用類型的、沒有非POD類類型的(即嵌套類都必須是POD)、沒有指針到成員類型的(因為這個類型內含了this指針)。
C++11把情況推廣為兩種:
類型是平凡的(trivial),則可以靜態初始化、可以用memcpy直接複製數據而不是必須用copy構造函數。其生存期始於它的對象的存儲被定義,無須等到構造函數完成。平凡class或結構必須滿足:
構造函數是平凡的,僅當類沒有虛成員函數也沒有虛基類。Copy/move運算符是平凡的,僅當沒有靜態數據成員。
類型是標準布局的(standard-layout)意味着它是有序的並且安排其成員兼容於C語言。這要求滿足:
一個class/struct/union是POD,當它是平凡的、標準布局的,所有數據成員是POD.
分為兩個概念,對象可以不滿足其中一個但是滿足另外一個。例如,類有複雜的move與copy構造函數,因此不是平凡的,但可能是標準布局因此能與C程序互操作。類似地,一個類的有public與private的非靜態數據成員,因此不是標準布局,但可以是平凡的因此可以memcpy操作。
POD類型在源代碼兼容於ANSI C時非常重要。POD對象與C語言的對應對象具有共同的一些特性,包括初始化、複製、內存布局、尋址。
一個例子是下述C++的new表達式中的對象初始化,POD與non-POD的區別[10]:
表達式 | POD類型T | non-POD類型T |
---|---|---|
new T | 不初始化 | 缺省初始化 |
new T() | 總是缺省初始化 | |
new T(x) | 總是調用構造函數初始化 |
因此,non-POD類型的對象或數組總是被初始化;而POD類型的對象或數組可能未被初始化.
其它與POD相關的C++特性:
"POD-struct ... types are layout-compatible if they have the same number of members, and corresponding members (in order) have layout-compatible types"[12].
POD-union ... types are layout-compatible if they have the same number of members, and corresponding members (in any order) have layout-compatible types"[13].
JAVA中,一些開發者認為POD類型是符合沒有public成員且沒有方法的類,比如data transfer object。其實不使用事件句柄並且不實現除getter和setter之外的附加方法的POJO(只含有getter和setter的類)和JAVA Bean也屬於POD。但不管怎麼樣,POJO和JAVA Bean已經有了封裝,已經違反了POD的定義了。
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.