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

C++空類的那點事兒

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

什么是C++的空類

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

class EmptyBase {

};

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

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

class EmptyBase {
public:

    // 構造函數
    EmptyBase(){

    }
    // 析構函數
    ~EmptyBase(){

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

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

    }
    // 靜態函數
    static void setStr(const std::string& s){

    }

    // 靜態變量
    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++空類的大小

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

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

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

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

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

空基類優化

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

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

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

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

class EmptyTwo: public EmptyOne,public EmptyBase{

};

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

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

空類存在的意義是什么

盡管在面向對象編程中,空類看起來可能有些多余,但是它們存確有它們的用途。

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

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

責任編輯:趙寧寧 來源: 思想覺悟
相關推薦

2015-12-08 14:49:13

SDN軟件定義網絡

2011-12-26 11:13:24

密碼

2020-01-03 07:57:39

UDPTCP網絡協議

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

數據庫MySQL主庫

2013-12-26 13:35:39

2012-03-12 21:23:47

Windows pho

2013-09-17 10:37:03

AOPAOP教程理解AOP

2018-03-30 16:03:04

軟件無狀態”

2011-05-24 16:20:27

虛函數

2021-04-13 09:12:45

網絡設備無線路由器交換機

2020-01-09 09:50:32

C++JavaPython

2019-02-12 11:45:05

Java數據庫開發

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技術棧公眾號

主站蜘蛛池模板: 一区二区三区韩国 | 国产视频2021 | av一二三区 | 中文字幕人成人 | 91精品麻豆日日躁夜夜躁 | 久草色视频 | 成人国产免费观看 | 粉嫩粉嫩芽的虎白女18在线视频 | 成人国产在线视频 | 91九色视频在线 | 成人精品一区二区三区 | 亚洲精品一级 | 国产片侵犯亲女视频播放 | 国产成人精品999在线观看 | 韩国主播午夜大尺度福利 | 免费精品视频 | 国产在线小视频 | 国产精品永久在线观看 | 久久国产精品视频 | 在线观看午夜视频 | 四虎影院免费在线播放 | 91美女在线观看 | 在线看片网站 | 午夜影院官网 | 婷婷综合网| a毛片| 美国a级毛片免费视频 | 中文字幕一区二区三区在线观看 | 久久久九九九九 | 国产男人的天堂 | 免费欧美视频 | 天天射美女 | 一级黄色裸片 | www日本高清视频 | 亚洲在线成人 | 成人妇女免费播放久久久 | 九九热精品视频在线观看 | 国产精品永久免费视频 | 欧美成人精品一区二区男人看 | 欧美久久久久久久久中文字幕 | 欧美又大粗又爽又黄大片视频 |