c++空類爲何佔用1個字符

在C++中空類會佔一個字節,這是爲了讓對象的實例可以相互區別。具體來講,空類一樣能夠被實例化,而且每一個實例在內存中都有獨一無二的地址,所以,編譯器會給空類隱含加上一個字節,這樣空類實例化以後就會擁有獨一無二的內存地址。若是沒有這一個字節的佔位,那麼空類就無所謂實例化了,由於實例化的過程就是在內存中分配一塊地址。
   
注意:當該空白類做爲基類時,該類的大小就優化爲0了,這就是所謂的空白基類最優化。
class T
{

};
int main()
{
    T t1, t2;
    cout<<sizeof(t1)<<endl;
    cout<<sizeof(t2)<<endl;
    cout<<&t1<<endl;
    cout<<&t2<<endl;
    return 0;
}

運行結果:c++

如上圖所示,這個佔位字節僅僅是用來佔位。
 
 
空白基類最優化:
class T
{

};

class TT :public T
{
  int a;
};
int main()
{
    T t1;
    TT tt1;
    cout<<sizeof(t1)<<endl;
    cout<<sizeof(tt1)<<endl;
    cout<<&t1<<endl;
    cout<<&tt1<<endl;
    return 0;
}

運行結果:安全

    在上例中,大部分編譯器對於sizeof(derive)的結果是4,而不是8。這就是所謂的空白基類最優化在(empty base optimization-EBO 或 empty base classopimization-EBCO)。在空基類被繼承後因爲沒有任何數據成員,因此子類優化掉基類所佔的1 byte。EBO並非c++標準所規定必須的,可是大部分編譯器都會這麼作。因爲空基類優化技術節省了對象沒必要要的空間,提升了運行效率,所以成爲某些強大技術的基石,基於類型定義類如stl中的binary_function、unary_function、iterator、iterator_traits的實現複用;基於策略類如內存管理、多線程安全同步的實現複用。當某個類存在空類類型的數據成員時,也可考慮藉助EBO優化對象佈局.
相關文章
相關標籤/搜索