最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C++中普通舊數(shù)據(jù)(POD)的使用

 更新時(shí)間:2023年03月03日 14:41:13   作者:洛克希德馬丁  
普通舊數(shù)據(jù)就是內(nèi)存中的連續(xù)字節(jié)序列,是能夠被“僅當(dāng)作數(shù)據(jù)”處理的對(duì)象。這篇文章主要帶大家了解一下C++中普通舊數(shù)據(jù)的定義與使用,感興趣的可以了解下

前言

在開發(fā)C++的時(shí)候,使用對(duì)象是繞不開的話題。很多時(shí)候我們關(guān)注點(diǎn)都在對(duì)象的“高級(jí)語(yǔ)義”上,比如“運(yùn)行時(shí)多態(tài)”,用戶自定義的拷貝語(yǔ)義等。想象這樣一種場(chǎng)景,給你一個(gè)含有100個(gè)對(duì)象的數(shù)組讓你拷貝一份副本,正常的操作肯定是調(diào)用100次拷貝構(gòu)造,但是你有沒(méi)有想過(guò)一種方法,可以像拷貝char型數(shù)組那樣使用內(nèi)存拷貝呢?沒(méi)錯(cuò),這就是我們今天要講的“普通舊數(shù)據(jù)”,簡(jiǎn)稱POD。

一、什么是普通舊數(shù)據(jù)

普通舊數(shù)據(jù)就是內(nèi)存中的連續(xù)字節(jié)序列,是能夠被“僅當(dāng)作數(shù)據(jù)”處理的對(duì)象,程序員無(wú)須顧及類布局的復(fù)雜性以及用戶自定義的構(gòu)造、拷貝和移動(dòng)語(yǔ)義。

二、使用步驟

當(dāng)然,不是所有的對(duì)象都滿足作為普通舊數(shù)據(jù)的條件,接下來(lái)我們就具體分析下,作為普通舊數(shù)據(jù)需要滿足哪些條件。先舉個(gè)例子:

//普通舊數(shù)據(jù)
    struct SO { };// 是 POD
    struct S1 { int a; };// 是 POD
    struct S2 { int a; S2(int aa) : a(aa) { } };//不是 POD (不是默認(rèn)構(gòu)造函數(shù))
    struct S3 { int a; S3(int aa) : a(aa) { } S3() {} };//是 POD (用戶自定義的默認(rèn)構(gòu)造函數(shù))
    struct S4 { int a; S4(int aa) : a(aa) { } S4() = default; };//是 POD
    struct S5 { virtual void f(); /* ... */ };//不是 POD (含有一個(gè)虛函數(shù))
    struct S6 : S1 { };// 是 POD
    struct S7 : SO { int b; };// 是 POD
    struct S8 : S1 { int b; };//不 是 POD (數(shù)據(jù)既屬于S1也屬于S8)
    struct S9 : SO, S1 {};// 是 POD

上面的例子幾乎涵蓋了普通舊數(shù)據(jù)能遇到的所有場(chǎng)景。然而我們?nèi)绻氚涯硞€(gè)對(duì)象“僅當(dāng)作數(shù)據(jù)”處理(當(dāng)作POD),則要求該對(duì)象必須滿足下述條件:

1.不具有復(fù)雜的布局,比如含有虛函數(shù)。

2.不具有非標(biāo)準(zhǔn)(用戶自定義的)拷貝語(yǔ)義。

3.含有一個(gè)最普通的默認(rèn)構(gòu)造函數(shù)。

這里的含有一個(gè)最普通的構(gòu)造函數(shù)是指“必要條件”,同時(shí)你也可以自定義一個(gè)構(gòu)造函數(shù)。

顯然,我們?cè)诙xPOD時(shí)必須非常謹(jǐn)慎,從而確保在不破壞任何語(yǔ)言規(guī)則的前提下使用這些優(yōu)化措施。正式的規(guī)定是(§iso.3.9,§iso.9):POD必須是屬于下列類型的對(duì)象:

1.標(biāo)準(zhǔn)布局類型(standard layout type)

2.平凡可拷貝類型(trivially copyable type)

3.具有平凡默認(rèn)構(gòu)造函數(shù)的類型

一個(gè)與之有關(guān)的概念是平凡類型(trivial type),它具有以下屬性:

1.一個(gè)平凡默認(rèn)構(gòu)造函數(shù)

2.平凡拷貝和移動(dòng)操作

通俗地說(shuō),當(dāng)一個(gè)默認(rèn)構(gòu)造函數(shù)無(wú)須執(zhí)行任何實(shí)際操作時(shí)(如果需要定義一個(gè)默認(rèn)構(gòu)造函數(shù),使用=default,保持默認(rèn)行為),那么他就是平凡構(gòu)造函數(shù)。

那么,什么樣的布局是標(biāo)準(zhǔn)布局呢?考慮以下幾種情形不滿足標(biāo)準(zhǔn)布局的要求:

1.含有一個(gè)非標(biāo)準(zhǔn)布局的非static成員或基類;

2.包含virtual函數(shù)

3.包含virtual基類

4.含有引用類型

5.其中的非靜態(tài)數(shù)據(jù)成員有多種訪問(wèn)修飾符

6.阻止了重要的布局優(yōu)化:在多個(gè)基類中都含有非static數(shù)據(jù)成員,或者在派生類和基類中都含有非static數(shù)據(jù)成員,或者基類類型與第一個(gè)非static數(shù)據(jù)成員的類型相同。

基本上,標(biāo)準(zhǔn)布局類型是指與C語(yǔ)言的布局兼容的類型,并且應(yīng)該能被常規(guī)的C++應(yīng)用程序二進(jìn)制接口(ABI)處理。

除非在類型內(nèi)部含有非平凡的拷貝操作、移動(dòng)操作或者析構(gòu)函數(shù),否則該類型就是平凡可拷貝的類型。通俗地說(shuō),如果一個(gè)拷貝操作能被實(shí)現(xiàn)成逐位拷貝的形式,則它是平凡的。那么,哪些情形下讓拷貝、移動(dòng)和析構(gòu)函數(shù)變得不平凡呢?

1.這些操作是用戶定義的。

2.這些操作所屬的類含有virtual函數(shù)。

3.這些操作所屬的類含有virtual基類。

4.這些操作所屬的類含有非平凡的基類或者成員。

內(nèi)置類型的變量都是平凡可拷貝的,且擁有標(biāo)準(zhǔn)布局。同樣,由平凡可拷貝對(duì)象組成的數(shù)組是平凡可拷貝的,由標(biāo)準(zhǔn)布局對(duì)象組成的數(shù)組擁有標(biāo)準(zhǔn)布局。

三、其他方法

說(shuō)了那么多概念,感覺(jué)人都瘋了,想要記住這些概念真的是不容易。好在C++標(biāo)準(zhǔn)庫(kù)幫我們實(shí)現(xiàn)了一個(gè)類型屬性謂詞is_pod。有了這個(gè)東西,我還記那些繁瑣的規(guī)則干什么呢?下面是使用方法,特別簡(jiǎn)單。

std::is_pod<T> //T 是POD嗎,是或不是

std::cout << std::is_pod<int>::value << std::endl; //value is bool

//示例
template<typename T>
void my_copy(T *to, const T *from, int count) {
    if (is_pod<T>::value)
        memcpy(to, from, count*sizeof(T));
    else
        for (int i = 0; i < count; ++i) {
            to[i] = from[i];
        }
}

總結(jié)

1.規(guī)則相當(dāng)復(fù)雜,但是努力還是記得住的。

2.不需要記復(fù)雜的規(guī)則,直接使用is_pod

3.如果你確實(shí)對(duì)C++語(yǔ)言的深層次內(nèi)容有非常濃厚的興趣,不妨花點(diǎn)時(shí)間研究一下C++標(biāo)準(zhǔn)中對(duì)布局和平凡性概念的規(guī)定(§iso.3.9,§iso.9)

到此這篇關(guān)于詳解C++中普通舊數(shù)據(jù)(POD)的使用的文章就介紹到這了,更多相關(guān)C++普通舊數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Clion配置opencv開發(fā)環(huán)境的詳細(xì)過(guò)程

    Clion配置opencv開發(fā)環(huán)境的詳細(xì)過(guò)程

    這篇文章主要介紹了Clion配置opencv開發(fā)環(huán)境的詳細(xì)過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考的下
    2022-04-04
  • C語(yǔ)言實(shí)現(xiàn)消消樂(lè)小游戲

    C語(yǔ)言實(shí)現(xiàn)消消樂(lè)小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)消消樂(lè)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 利用Qt實(shí)現(xiàn)可擴(kuò)展對(duì)話框的示例代碼

    利用Qt實(shí)現(xiàn)可擴(kuò)展對(duì)話框的示例代碼

    可擴(kuò)展對(duì)話框通常用于用戶對(duì)界面有不同要求的場(chǎng)合。當(dāng)供高級(jí)用戶使用或需要更多信息時(shí),可通過(guò)某種方式的切換顯示完整對(duì)話窗體(擴(kuò)展窗體)。本文將用Qt實(shí)現(xiàn)可擴(kuò)展對(duì)話框,需要的可以參考一下
    2022-06-06
  • C++全面精通類與對(duì)象

    C++全面精通類與對(duì)象

    類和對(duì)象是兩種以計(jì)算機(jī)為載體的計(jì)算機(jī)語(yǔ)言的合稱。對(duì)象是對(duì)客觀事物的抽象,類是對(duì)對(duì)象的抽象。類是一種抽象的數(shù)據(jù)類型;變量就是可以變化的量,存儲(chǔ)在內(nèi)存中—個(gè)可以擁有在某個(gè)范圍內(nèi)的可變存儲(chǔ)區(qū)域
    2022-05-05
  • Opencv下載和導(dǎo)入Visual studio2022的實(shí)現(xiàn)步驟

    Opencv下載和導(dǎo)入Visual studio2022的實(shí)現(xiàn)步驟

    本文主要介紹了Opencv下載和導(dǎo)入Visual studio2022的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 一文詳解C++的訪問(wèn)說(shuō)明符

    一文詳解C++的訪問(wèn)說(shuō)明符

    訪問(wèn)說(shuō)明符是 C++ 中控制類成員(屬性和方法)可訪問(wèn)性的關(guān)鍵字,它們用于封裝類數(shù)據(jù)并保護(hù)其免受意外修改或?yàn)E用,本文將給大家詳細(xì)的介紹一下C++的訪問(wèn)說(shuō)明符,感興趣的朋友可以參考下
    2024-04-04
  • C++?string如何獲取文件路徑文件名、文件路徑、文件后綴(兩種方式)

    C++?string如何獲取文件路徑文件名、文件路徑、文件后綴(兩種方式)

    這篇文章主要介紹了C++?string如何獲取文件路徑文件名、文件路徑、文件后綴(兩種方式),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2023-06-06
  • C++利用EasyX編寫貪吃蛇游戲的示例代碼

    C++利用EasyX編寫貪吃蛇游戲的示例代碼

    EasyX, 全名EasyX Graphics Library, 是針對(duì) Visual C++ 的免費(fèi)繪圖庫(kù),本文將為大家介紹如何使用EasyX編寫貪吃蛇游戲,需要的小伙伴可以參考下
    2023-08-08
  • c/c++拷貝構(gòu)造函數(shù)和關(guān)鍵字explicit詳解

    c/c++拷貝構(gòu)造函數(shù)和關(guān)鍵字explicit詳解

    這篇文章主要介紹了c/c++拷貝構(gòu)造函數(shù)和關(guān)鍵字explicit的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-08-08
  • C++中的整型

    C++中的整型

    這篇文章我們來(lái)聊聊C++中的整型,整型即整數(shù),與小數(shù)對(duì)應(yīng)。許多語(yǔ)言只能表示一種整型(如Python),而在C++當(dāng)中根據(jù)整數(shù)的范圍提供了好幾種不同的整型,下面文章我們就來(lái)看看具體是哪幾種,需要的朋友也可以參考一下
    2021-11-11

最新評(píng)論

信丰县| 元朗区| 鄂托克旗| 临高县| 施秉县| 垣曲县| 浙江省| 饶平县| 攀枝花市| 吴旗县| 锡林浩特市| 巴林右旗| 昌邑市| 蓝山县| 青冈县| 临城县| 五莲县| 论坛| 和平区| 揭西县| 文化| 南川市| 大足县| 静宁县| 蓬莱市| 原阳县| 光泽县| 廉江市| 凌海市| 永清县| 萨迦县| 安阳市| 涞源县| 施秉县| 塔河县| 故城县| 通海县| 徐闻县| 阿图什市| 伊通| 揭东县|