模板與繼承之藝術 空基類優化

2022-04-01 00:44:51 字數 2509 閱讀 1936

1、概念

c++中有「空」類的概念,這就意味著在執行期間其內部不好任何記憶體。

只包含型別的成員函式、非虛成員函式和靜態資料成員的類為空類。

非靜態的資料成員,虛函式和虛基類則在執行時期消耗儲存空間。

2、空基類優化如下:

#include

using namespace std;

class empty;

class emptytoo : public empty

{};class emptythree : public emptytoo

{};int main()

(1)在類emptytoo中類empty沒有分配儲存空間

(2)帶有優化空基類的空類作為被繼承的基類(沒有其他基類時,單繼承)時,其大小也為0,這也就是emptytree 能和empty具有相同大小的原因所在。

3、如果有其他基類時:

如果繼承時是多重繼承:

emptythree中有兩個不同的子類empty物件,乙個是直接繼承來的empty物件,另乙個是emptytoo繼承來的empty物件。

由於是兩個物件所以不能讓其有相同的位址空間。即這裡優化(2)不起作用,emptythree是兩個empty和emptytoo大小之和。

4、將成員作為基類

只舉一例,模板引數確定會被例項化為型別(不是非型別,不是原生型別比如int),該模板類的另乙個成員型別不是空類。如下:

template

class optimizable;

改寫為:

template

class optimizable ;

//template

class basememberpair : private base

//通過first來訪問基類資料

base const&  first() const

base& first() const

//通過second()來訪問成員變數

member const& second() const

member& second() const

};優化前:

優化後:

#includeusing

namespace

std;

template

class basememberpair : private

base

//通過first來訪問基類資料

base const& first() const //

提供給const物件呼叫

base& first()

//通過second()來訪問成員變數

5、警告:

針對下面的情況:

template

class myclass;

//優化

template

class myclass : private t1, private t2{};

在不知道t1和t2是否為型別的情況下,最好不要盲目使用上面的優化方法,因為:

(1)此方法不適用於原生型別int等

(2)如果t1, 和t2的型別相同繼承會出問題。

(3)增加基類會改變介面,因為多重繼承,如果t1和t2都有共同的基類base的話,那麼myclass中的資料成員,成員函式將會有二義性。所以此方法最好適應是之前提演示出的情況。

c 空基類優化

我們知道c 中乙個空類的大小為1個位元組,那麼如果乙個空類作為基類或者成員物件的時候會怎樣呢,是不是還是一定占用1個位元組呢?c 中為保證同一型別的不同物件位址始終有別,要求任何物件或成員子物件,即使該型別是空的類型別 即沒有非靜態資料成員的 class 或 struct 也是如此。然而,基類子物件...

C EBO 空基類最優化

ebo全稱empty base optimization 最近看effectivec 條款39,這個名詞讓我很陌生,學過之後發現也不是什麼新鮮玩意了。empty base optimization,空基類最優化,說到什麼是ebo,要先從一道面試題說起 class a cout cout 如果繼承空類...

模板與繼承之藝術 奇特的遞迴模板模式(CRTP)

一 什麼是crtp 奇特的模板遞迴模式 curiously recurring template pattern 即將派生類本身作為模板引數傳遞給基類。template class baset class d public baset 類d是乙個非依賴型基類,不是模板。1 被繼承的類模板 baset...