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
};優化前:
優化後:
#includeusingnamespace
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...