亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

前言

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

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

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

二、使用步驟

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

//普通舊數(shù)據(jù)
    struct SO { };// 是 POD
    struct S1 { int a; };// 是 POD
    struct S2 { int a; S2(int aa) : a(aa) { } };//不是 POD (不是默認構(gòu)造函數(shù))
    struct S3 { int a; S3(int aa) : a(aa) { } S3() {} };//是 POD (用戶自定義的默認構(gòu)造函數(shù))
    struct S4 { int a; S4(int aa) : a(aa) { } S4() = default; };//是 POD
    struct S5 { virtual void f(); /* ... */ };//不是 POD (含有一個虛函數(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ù)能遇到的所有場景。然而我們?nèi)绻氚涯硞€對象“僅當作數(shù)據(jù)”處理(當作POD),則要求該對象必須滿足下述條件:

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

2.不具有非標準(用戶自定義的)拷貝語義。

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

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

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

1.標準布局類型(standard layout type)

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

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

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

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

2.平凡拷貝和移動操作

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

那么,什么樣的布局是標準布局呢?考慮以下幾種情形不滿足標準布局的要求:

1.含有一個非標準布局的非static成員或基類;

2.包含virtual函數(shù)

3.包含virtual基類

4.含有引用類型

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

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

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

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

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

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

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

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

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

三、其他方法

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

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ī)則相當復雜,但是努力還是記得住的。

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

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

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

相關(guān)文章

  • C++使用回溯法解決黃金礦工問題

    C++使用回溯法解決黃金礦工問題

    在矩陣中考察回溯算法,分為任意起點、左上角開始等情況。從而有不同的模板,其實區(qū)別就是直接開始還是每個坐標都去嘗試,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-10-10
  • C++類的定義和對象的創(chuàng)建詳解

    C++類的定義和對象的創(chuàng)建詳解

    本篇文章重點講解了兩種創(chuàng)建對象的方式:一種是在棧上創(chuàng)建,形式和定義普通變量類似;另外一種是在堆上使用 new 關(guān)鍵字創(chuàng)建,必須要用一個指針指向它,下面和小編一起來學習下面為文章的內(nèi)容
    2021-09-09
  • C++中Semaphore內(nèi)核對象用法實例

    C++中Semaphore內(nèi)核對象用法實例

    這篇文章主要介紹了C++中Semaphore內(nèi)核對象用法實例,有助于深入了解信號量(Semaphore)的基本用法,需要的朋友可以參考下
    2014-10-10
  • 使用OpenGL實現(xiàn)3D立體顯示的程序代碼

    使用OpenGL實現(xiàn)3D立體顯示的程序代碼

    本篇文章是對使用OpenGL實現(xiàn)3D立體顯示的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++編程中__if_exists與__if_not_exists語句的用法

    C++編程中__if_exists與__if_not_exists語句的用法

    這篇文章主要介紹了C++編程中__if_exists與__if_not_exists語句的用法,是C++中用于判斷指定的標識符是否存在的基礎(chǔ)的條件判斷語句,需要的朋友可以參考下
    2016-01-01
  • C++實現(xiàn)屏幕截圖功能

    C++實現(xiàn)屏幕截圖功能

    這篇文章主要為大家詳細介紹了C++實現(xiàn)屏幕截圖功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • c++11新特性多線程操作實戰(zhàn)

    c++11新特性多線程操作實戰(zhàn)

    這篇文章主要介紹了c++11新特性多線程操作實戰(zhàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • 詳解C++中的雙冒號 ::

    詳解C++中的雙冒號 ::

    這篇文章主要介紹了C++中的雙冒號 ::,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-09-09
  • C++日期與時間 chrono庫介紹及使用教程

    C++日期與時間 chrono庫介紹及使用教程

    chrono庫是C++11中的一個標準庫,它提供了一系列與時間相關(guān)的類和函數(shù),用于表示和處理時間間隔,時鐘和時間點,C++20新增Calendar,這篇文章主要介紹了C++日期與時間 chrono庫介紹及使用,需要的朋友可以參考下
    2023-12-12
  • C++中的6種構(gòu)造函數(shù)舉例詳解

    C++中的6種構(gòu)造函數(shù)舉例詳解

    這篇文章主要介紹了C++中的6種構(gòu)造函數(shù)的相關(guān)資料,C++中構(gòu)造函數(shù)用于類對象初始化,類型包括默認構(gòu)造函數(shù)、參數(shù)化構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)等,默認構(gòu)造函數(shù)通常不需要參數(shù),編譯器會自動生成,除非存在其他構(gòu)造函數(shù),需要的朋友可以參考下
    2024-10-10

最新評論