成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++空類的那點事兒

開發(fā) 前端
在C++標準庫中,五種迭代器類別都有對應的空類。這些空類用于標識迭代器的類別,并通過模板特化來實現(xiàn)對不同類型迭代器的特殊處理。

什么是C++的空類

顧名思義,空類就是指哪些不包含成員變量的類。例如以下這個就是一個空類:

class EmptyBase {

};

既然如此,那么是不是說空類的內(nèi)部一定不會其他代碼呢?不是的,空類內(nèi)部也可以包含其他東西,例如:構(gòu)造函數(shù)、析構(gòu)函數(shù)、靜態(tài)成員變量、靜態(tài)函數(shù)、成員函數(shù)、typedef語句等。

例如在以下代碼中EmptyBase依然是空類:

class EmptyBase {
public:

    // 構(gòu)造函數(shù)
    EmptyBase(){

    }
    // 析構(gòu)函數(shù)
    ~EmptyBase(){

    }
    // typedef并沒有給類增加成員或者函數(shù)

    typedef int INT_NUM;
    
    // 不涉及到內(nèi)部成員變量的內(nèi)部函數(shù)
    void set(int a){

    }
    // 靜態(tài)函數(shù)
    static void setStr(const std::string& s){

    }

    // 靜態(tài)變量
    static std::string str;
};

在C++11之后我們可以使用std::is_empty判斷一個類是否是空類:

#include <iostream>
class EmptyBase {

};

int main() {
    
    auto aa = std::is_empty<EmptyBase>::value;
    std::cout << "是否是空類:" << aa << std::endl;
    return 0;
}

C++空類的大小

有以下計算空類大小的代碼,你認為輸出結(jié)果是多少?

#include <iostream>
class EmptyClass {
    // 空類
};
int main(int argc, char* argv[]) {
    std::cout << "sizeof(EmptyClass): " << sizeof(EmptyClass) << std::endl;
    return 0;
}

即使是空類,其大小也不會為0。在許多平臺上,空類的大小為1;而在某些對于對齊(alignment)要求更嚴格系統(tǒng)上,空類的大小可能是另一個數(shù)(通常是4)。

為什么C++空類的大小不是0呢?

C++的設計者們不允許類的大小為0,因為每個對象都必須具有唯一的地址,特別是在涉及到取址和指針計算時,如果一個類的大小是0,那么指針的一切將會失效。 試想一下如果空類的大小為0,那么由空類它們構(gòu)成的數(shù)組,其大小必然也是0,這會導致指針運算中普遍使用的性質(zhì)失效。

空基類優(yōu)化

C++標準規(guī)定,當空類作為基類時,只要不會與同一類型的另一個對象或子對象分配在同一地址,就不需為其分配任何空間。

#include <iostream>
class EmptyBase {
    // 空基類
};

class EmptyOne: public EmptyBase{
    // 空類1
};

class EmptyTwo: public EmptyOne{
    // 空類2
};

int main(int argc, char* argv[]) {
    std::cout << "sizeof(EmptyBase): " << sizeof(EmptyBase) << std::endl;
    std::cout << "sizeof(EmptyOne): " << sizeof(EmptyOne) << std::endl;
    std::cout << "sizeof(EmptyTwo): " << sizeof(EmptyTwo) << std::endl;
    return 0;
}

如果編譯器支持空基類優(yōu)化,上述程序所有的輸出結(jié)果相同(一般是1),但均不為0。

我們修改一下代碼,將EmptyTwo改為多繼承,那么EmptyTwo還是空類嗎?

class EmptyTwo: public EmptyOne,public EmptyBase{

};

答案是在多繼承狀態(tài)的EmptyTwo已經(jīng)不是空類了, 雖然EmptyTwo和它的基類都沒有任何成員。不過,EmptyTwo的基類EmptyOne和EmptyBase不能分配到同一地址空間, 否則EmptyTwo的基類EmptyBase會和EmptyOne的基類EmptyBase撞在同一地址空間上。換句話說,兩個相同類型的子對象偏移量相同,這是C++對象布局規(guī)則不允許的。

對空基類優(yōu)化進行限制的根本原因在于,我們需要能比較兩個指針是否指向同一對象。 由于指針幾乎總是用地址作內(nèi)部表示,所以我們必須保證兩個不同的地址(即兩個不同的指針值)對應兩個不同的對象。 雖然這種約束看起來并不非常重要,但是在實際應用中的許多類都是繼承自一組定義公共typedefs的基類,當這些類作為子對象出現(xiàn)在同一對象中時,問題就凸現(xiàn)出來了,此時優(yōu)化應被禁止。

空類存在的意義是什么

盡管在面向?qū)ο缶幊讨校疹惪雌饋砜赡苡行┒嘤啵撬鼈兇娲_有它們的用途。

空類是一種有著潛在應用價值的編程技巧,例如空類可以被用于多種編程模式和設計模式中,它還可以作為數(shù)據(jù)類型的標記,用于在編譯時實現(xiàn)條件編譯。 空類也可以作為接口占位符,用于后續(xù)的繼承實現(xiàn)或者后續(xù)擴展等。空類也在模板編程和元編程等高級編程技術(shù)中也發(fā)揮重要作用。

例如在C++標準庫中,五種迭代器類別都有對應的空類。這些空類用于標識迭代器的類別,并通過模板特化來實現(xiàn)對不同類型迭代器的特殊處理,如圖:

責任編輯:趙寧寧 來源: 思想覺悟
相關(guān)推薦

2015-12-08 14:49:13

SDN軟件定義網(wǎng)絡

2011-12-26 11:13:24

密碼

2020-01-03 07:57:39

UDPTCP網(wǎng)絡協(xié)議

2009-08-18 17:55:20

C#操作符重載

2012-04-17 11:21:50

Java

2022-05-26 15:30:21

Spring AOP框架

2022-05-26 09:03:39

AOP編程

2017-09-12 08:03:29

數(shù)據(jù)庫MySQL主庫

2013-12-26 13:35:39

2012-03-12 21:23:47

Windows pho

2018-03-30 16:03:04

軟件無狀態(tài)”

2013-09-17 10:37:03

AOPAOP教程理解AOP

2011-05-24 16:20:27

虛函數(shù)

2021-04-13 09:12:45

網(wǎng)絡設備無線路由器交換機

2020-01-09 09:50:32

C++JavaPython

2019-02-12 11:45:05

Java數(shù)據(jù)庫開發(fā)

2010-05-21 15:34:02

Exchange 20

2010-01-21 13:33:44

C++基類

2017-04-19 08:35:34

2013-12-04 09:46:56

Hyper-VNUMA
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 女生羞羞视频 | 97色在线观看免费视频 | 亚洲免费成人av | 五月婷婷激情网 | 99爱国产| 亚洲一级视频在线 | 久久av网 | 日韩欧美在 | 玖玖玖av| 久久久www成人免费精品 | 一级黄色录像片子 | 亚洲另类视频 | 中文字幕在线观看成人 | 在线看无码的免费网站 | 国产精品九九九 | 精品久久久久久久久久 | www.久久久.com| 精品亚洲一区二区 | 欧美精品一二三区 | 成人在线小视频 | 天天综合久久 | 一区二区三区免费 | 欧美日本韩国一区二区 | 亚洲成人福利 | 亚洲成人av一区二区 | 欧美第一区 | 色久五月| 亚洲精品在线看 | 中文欧美日韩 | 精品免费视频 | 午夜免费 | 亚洲精品乱码久久久久久按摩 | 国产xxx在线观看 | 国产精品久久精品 | 亚洲国产一区二区三区 | 国产美女一区二区 | www狠狠干 | 亚洲欧美日韩成人在线 | 欧美一区二区三区 | 精品一区二区电影 | 国产69久久精品成人看动漫 |