在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

POD到底是什么?聊聊POD

CPP開發者 ? 來源:高性能架構探索 ? 2023-06-19 15:24 ? 次閱讀

概述

POD,即Plain Old Data的縮寫,plain代表普通,Old代表舊,從字面意思看是老的、普通的數據類型。這個概念由C++引入主要是為了與C兼容,或者說POD就是與C兼容的那邊部分數據類型。在C++對POD類型進行序列化生成二進制后,在C語言中可以對該二進制進行解析成功。如果對于一個非POD類型,假如包含虛函數的class,大家知道編譯器在操作的時候會加入虛函數指針,但是虛函數這個概念在C語言中不存在,遇到這種數據編譯器就不認識了,或者說對于一個非POD類型的數據,C語言是不識別的,于是C++就提出了POD數據類型的概念。

POD的一種常見用法是跨系統或者跨語言進行通訊,比如與C/.NET等編寫的代碼進行通訊。

概念

structA{
intx;
inty;
};
structB{
private:
intx;
public:
inty;
};
structC{
inta;
intb;
C(intx,inty):a{x},b{y}{}
};

那么,問題來了,上述三個類型A、B和C,哪個是POD類型?

如果我們不清楚POD的判斷標準的話,只能靠猜來回答該問題,幸運的是Modern Cpp提供了接口來進行判斷(PS:下面的trivial和standard layout用來輔助判斷):

C++11 C++17 描述
std::is_pod std::is_pod_v 通過其value是否為ture來表示是否為POD類型(std::is_pod::value)
std::is_trivial std::is_trivial_v 通過其value是否為ture來表示是否為平凡類型(std::is_trivial::value)
std::is_standard_layout std::is_standard_layout_v 通過其value是否為ture來表示是否為標準布局(std::is_standard_layout::value)

如果使用上述接口對前面例子中的對象A、B和C進行判斷的話,結果如下:

類型 Trivial(平凡類型) Standard layout(標準布局) POD
A
B
C

從上述結果可以看出,B是平凡類型,C是標準布局,A既是平凡類型,又是標準布局,同時也是POD類型,這就引出了POD的定義:

A POD type is a type that is both trivial and standard-layout. This definition must hold recursively for all its non-static data members.

通過上述定義可以看出,POD類型既是平凡類型又是標準布局,反過來可以理解為如果一個類型既是平凡類型又是標準布局,且其內部非靜態成員變量也滿足該條件(既是平凡類型又是標準布局),那么這個類型就是POD類型。

標準對POD定義如下:

A POD class is a class that is both a trivial class and a standard-layout class, and has no non-static data members of type non-POD class (or array thereof). A POD type is a scalar type, a POD class, an array of such a type, or a cv-qualified version of one of these types.

與前一個定義相比,新增了一個類型scalar type,cppference中提到,scalar type為以下幾個之一:

?an arithmetic type

?an enumeration type

?a pointer type

?a pointer-to-member type

?thestd::nullptr_ttype

?cv-qualified versions of the above types

好了,從上面的內容中提到,一個POD類型的類,其非靜態成員變量也必須是POD的,對靜態成員變量和成員函數則沒有這個要求,如下這個類D,其仍然是POD:

structD{
inta;
intb;
staticstd::strings;
intget(){
returna;
}
};

在本小節中,我們提到了三個概念:Trivial(平凡類型)、Standard layout(標準布局)以及Scalar type,對于最后一個Scalar type比較簡單,所以在后面的內容中,將針對前兩個概念進行詳細分析。

Trivial

這個概念比較抽象,乃至于很難用一句簡單的話來描述。于是查閱了cppreference,顯示標準對這塊也沒有一個完整的定義:

Note: the standard doesn't define a named requirement with this name. This is a type category defined by the core language. It is included here as a named requirement only for consistency.

于是搜索了相關資料,微軟官網對這塊的定義如下:

When a class or struct in C++ has compiler-provided or explicitly defaulted special member functions, then it is a trivial type. It occupies a contiguous memory area. It can have members with different access specifiers. In C++, the compiler is free to choose how to order members in this situation.

也就是說,當一個類型(class/struct)同時滿足以下幾個條件時,它就是trivial type:

?沒有虛函數或虛基類。

?由編譯器生成(使用=default或者=delete)默認的特殊成員函數,包括默認構造函數、拷貝構造函數、移動構造函數、賦值運算符、移動賦值運算符和析構函數。

?數據成員同樣需要滿足條件 1 和 2。

舉例如下:

classA{
public:
A(inti):n(i){}
A(){}
private:
intn;
};

classB{
public:
B(inti):n(i){}
B()=default;
private:
intn;
};

classC{
public:
C(inti):n(i){}
C()=delete;
private:
intn;
};

structBase{
intx;
inty;
};

structDerived:publicBase
{
private:
intz;
};

intmain(){
std::cout<::value<::value<::value<::value<::value<

平凡類型具有如下屬性:

?占據一塊連續的內存區域

?由于對齊要求,成員變量之間可以填充對齊字節(padding)

?可以使用 memcpy進行對象拷貝

?可以將一個平凡的類型通過memcpy()放入char或者unsigned char數組,然后可以把數組內的內容重新組裝成一個該類型對象

?允許有多個不同的訪問控制符,但是,在這種情況下,編譯器有可能對其進行重排

針對上述最后一個屬性,示例如下:

structC{
public:
intx;

private:
inty;

public:
intz;
};

編譯器可以將其重新排序為如下這種:

structC{
public:
intx;
intz;
private:
inty;
};

正是因為如上原因(訪問權限編譯器重排),普通類型不能安全的與其他語言編寫的代碼進行交互操作。我們以C語言為例,編譯器的重排導致不能不能與C語言兼容(或者說C語言解析失敗),因為C語言不識別private這個訪問權限,如果進行交互操作,可能會導致其他意想不到的問題。

Standard layout

布局指的是類、結構體或者聯合(Union)的成員在內存中的排列。標準布局定義了這樣一種類型,它不使用C中不存在的而在CPP中存在的某些功能或者特性。如果某個類是標準布局,那么可以通過memcpy進行復制,而且可以與C語言中定義的同種類型進行交互。一言以蔽之,具有標準布局類的類或者結構體等與C兼容,并行可以通過C的API進行交互。

既然符合標準布局的類只具有C語言中存在的功能或者特性,那么,很容易總結出來標準布局的條件:

1.沒有虛函數或者虛基類

2.沒有引用類型的非靜態成員變量

3.所有的非靜態成員變量具有相同的訪問控制權限

4.所有的非靜態成員變量和基類都是標準布局

5.沒有多重繼承導致的菱形問題

6.子類中的第一個非靜態成員的類型與其基類不同

7.在class或者struct繼承時,滿足以下兩種情況之一(總結就是要么子類有非靜態成員變量,要么父類有):

?派生類中有非靜態成員,且只有一個僅包含靜態成員的基類

?基類有非靜態成員,而派生類沒有非靜態成員

現在我們結合示例代碼進行分析:

structA{
};
structB{
Aa;
doubleb;
};
structC{
voidfoo(){}
};
structD:publicC
{
intx;
inty;
};

依據前面標準布局的要求,上述幾個類A、B、C和D都是標準布局。現在我們構造稍微復雜點的例子:

structE
{
intx;
};

structF:publicE
{
inty;
};

structG
{
intx;
private:
virtualvoidfoo(){};
};

structH{};
structX:publicH{};
structY:publicH{};
structK:publicX,Y{};

structL{
intx;
private:
inty;
};

上面這些例子中,E是標準布局,G不屬于標準布局(虛函數,不滿足條件1),K不屬于標準布局(菱形繼承,不滿足條件5),L不屬于標準布局(不同的訪問權限,不滿足條件3)

接著我們看下前面條件中比較難理解的一個子類中的第一個非靜態成員的類型與其基類不同,示例如下:

structM{
intx;
};

structN:publicM{
Mm;
inta;
};

structX{
intx;
};

structY:publicX{

};

structZ:publicX{
inty;
};

在上述例子中,M、X和Y是標準布局,而N(不滿足條件6)和Z(不滿足條件7)不是標準類型。


審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編譯器
    +關注

    關注

    1

    文章

    1634

    瀏覽量

    49130
  • C++語言
    +關注

    關注

    0

    文章

    147

    瀏覽量

    6992
  • POD
    POD
    +關注

    關注

    0

    文章

    16

    瀏覽量

    6025

原文標題:我們通常說的 POD 到底是什么?

文章出處:【微信號:CPP開發者,微信公眾號:CPP開發者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    介紹如何安裝E1135C PDU和Pod升級

    Describes how to install the E1135C PDU and Pod upgrade.
    發表于 08-21 14:07

    從零開始入門 K8s| 詳解 Pod 及容器設計模式

    LogCollector 容器給看到。以上就是 Pod 實現存儲的方式。三、詳解容器設計模式現在我們知道了為什么需要 Pod,也了解了 Pod 這個東西到底是怎么實現的。最后,以此為
    發表于 09-20 15:12

    Pod資源配置

    《Kubernetes進階實戰》第四章《管理Pod資源對象》
    發表于 10-22 14:39

    尋找Kintex UltraScale POD12輸出Vol / Voh?

    我正在尋找Kintex UltraScale POD12輸出Vol / Voh。 DS892表16顯示了直流輸出電平,但這些值似乎僅用于測量Rol / Roh。我應該使用表9中的LVCMOS12
    發表于 07-27 14:52

    Land Pattern and POD

    Land Pattern and POD
    發表于 03-05 15:59 ?0次下載
    Land Pattern and <b class='flag-5'>POD</b>

    Kubernetes組件pod核心原理

    1. 核心組件原理 —— pod 核心原理 1.1 pod 是什么 pod 也可以理解是一個容器,裝的是 docker 創建的容器,也就是用來封裝容器的一個容器; pod 是一個虛擬化
    的頭像 發表于 09-02 09:27 ?1827次閱讀

    pod底層網絡和數據存儲是如何進行的

    1. 核心組件原理 —— pod 核心原理 1.1 pod 是什么 pod 也可以理解是一個容器,裝的是 docker 創建的容器,也就是用來封裝容器的一個容器; pod 是一個虛擬化
    的頭像 發表于 09-24 11:35 ?1689次閱讀

    Horizontal Pod Autoscaler的工作原理

    Horizontal Pod Autoscaler(HPA,Pod水平自動伸縮),根據平均 CPU 利用率、平均內存利用率或你指定的任何其他自定義指標自動調整 Deployment
    的頭像 發表于 09-21 10:57 ?1463次閱讀

    如何利用Docker實現Pod

    Container 和 Pod 是相似的。在底層,它們主要依賴 Linux 命名空間和 cgroup。但是,Pod 不僅僅是一組容器。Pod 是一個自給自足的高級構造。
    發表于 11-14 12:51 ?1402次閱讀

    Kubernetes中的Pod簡易理解

    Pod是Kubernetes中非常重要的概念,也是Kubernetes管理的基本單位。正如其名,Pod像一個豌豆莢,可以容納多個container,擁有相同的IP地址。
    的頭像 發表于 02-15 10:44 ?1278次閱讀

    什么是CNI,基于Calico的Pod網絡介紹

    每一個Node上都會有一個tunl0的虛擬網卡,這個網卡可以理解成網橋,所有Pod都要基于此網橋來和其它Pod通信。 ② 每生成一個新的Pod,那么在Node上都會生成一個calixxxx的虛擬網卡,這個網卡會對應到
    發表于 04-20 09:37 ?2353次閱讀

    k8s與pod之間是如何進行網絡隔離的?

    NetworkPolicy用來控制PodPod之間的網絡通信,它也支持針對Namespace進行限制。
    的頭像 發表于 05-11 09:35 ?1558次閱讀
    k8s與<b class='flag-5'>pod</b>之間是如何進行網絡隔離的?

    iOS中Pod庫資源引用探究

    Cocoapods中Pod引用資源的方式有多種,不同的方式對資源的使用還是有區別的,但也有一定的規律,這里我用一個樣例工程來進行說明,樣例工程名叫:AssetsDemo,使用pod lib create AssetsDemo命令創建,目錄結構如圖:
    的頭像 發表于 05-26 11:11 ?926次閱讀
    iOS中<b class='flag-5'>Pod</b>庫資源引用探究

    Pod是如何在底層實現的?如何使用Docker創建Pod

    剛開始接觸 Kubernetes 時,你學到的第一件事就是每個 Pod 都有一個唯一的 IP 和主機名,并且在同一個 Pod 中,容器可以通過 localhost 相互通信。所以,顯而易見,一個 Pod 就像一個微型的服務器。
    的頭像 發表于 08-14 10:33 ?1307次閱讀
    <b class='flag-5'>Pod</b>是如何在底層實現的?如何使用Docker創建<b class='flag-5'>Pod</b>?

    Pod一直處于Pending狀態?什么是Pod拓撲約束?

    起因: 今天在部署組件的時候,發現組件的pod一直處于Pending狀態,報錯顯示的原因是:不滿足Pod拓撲分布約束,看了代碼發現是原來同事給組件新增了Pod拓撲約束。
    的頭像 發表于 12-18 11:46 ?1216次閱讀
    <b class='flag-5'>Pod</b>一直處于Pending狀態?什么是<b class='flag-5'>Pod</b>拓撲約束?
    主站蜘蛛池模板: 欧美一级高清黄图片| 色老头影视| 女人夜夜春| 91视频污污版| 中国胖女人一级毛片aaaaa| 美女视频网站免费播放视| 91精选视频在线观看| 国产在线视频资源| 欧美爱爱网| 日本拍拍视频| 日日噜夜夜噜| 天堂最新版| 在线五月婷婷| 字幕网中文aⅴ资源站| 久久久国产在线| 亚洲aaa视频| se97se成人亚洲网站在线观看| 福利社看片| 国产精品午夜高清在线观看| 人人草人| 欧美女同在线| 2018天天干天天射| 97精品伊人久久久大香线焦| 理论片亚洲| 免费一级特黄特色大片| 成人综合激情| 久久老色鬼天天综合网观看| 成人窝窝午夜看片| 三级aa久久| 日本一区二区三区在线观看视频| 高h文男主又粗又狠| 综合色视频| 色婷婷六月丁香七月婷婷| 久久这里只有精品免费视频| 久久99色| 国产国语videosex另类| 成年女人在线观看| 怡红院影院| 天天插天天操天天射| 日日干天天干| 久久久精品免费观看|