91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中普通舊數據怎么使用

發布時間:2023-03-07 17:47:38 來源:億速云 閱讀:125 作者:iii 欄目:開發技術

本篇內容主要講解“C++中普通舊數據怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C++中普通舊數據怎么使用”吧!

一、什么是普通舊數據

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

二、使用步驟

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

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

上面的例子幾乎涵蓋了普通舊數據能遇到的所有場景。然而我們如果想把某個對象“僅當作數據”處理(當作POD),則要求該對象必須滿足下述條件:

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

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

3.含有一個最普通的默認構造函數。

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

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

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

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

3.具有平凡默認構造函數的類型

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

1.一個平凡默認構造函數

2.平凡拷貝和移動操作

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

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

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

2.包含virtual函數

3.包含virtual基類

4.含有引用類型

5.其中的非靜態數據成員有多種訪問修飾符

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

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

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

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

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

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

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

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

三、其他方法

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

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];
        }
}

到此,相信大家對“C++中普通舊數據怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

茶陵县| 同德县| 分宜县| 东丽区| 正定县| 资阳市| 东阿县| 岳普湖县| 紫金县| 桃园市| 长乐市| 天等县| 民和| 霍城县| 海宁市| 会泽县| 峨眉山市| 城固县| 扎囊县| 息烽县| 桑植县| 阿鲁科尔沁旗| 博乐市| 自贡市| 平陆县| 蓬莱市| 本溪市| 洱源县| 神池县| 宜阳县| 恭城| 诸暨市| 田林县| 北川| 金门县| 云阳县| 安平县| 东辽县| 新乡县| 江油市| 广州市|