C++中空類佔一位元組原因詳解
阿新 • • 發佈:2019-02-18
C++中空類佔位問題
在C++中空類會佔一個位元組,這是為了讓物件的例項能夠相互區別。具體來說,空類同樣可以被例項化,並且每個例項在記憶體中都有獨一無二的地址,因此,編譯器會給空類隱含加上一個位元組,這樣空類例項化之後就會擁有獨一無二的記憶體地址。如果沒有這一個位元組的佔位,那麼空類就無所謂例項化了,因為例項化的過程就是在記憶體中分配一塊地址。
注意:當該空白類作為基類時,該類的大小就優化為0了,這就是所謂的空白基類最優化。
#include<iostream>
using namespace std;
class test
{
};
int main()
{
test a, b;
cout << "sizeof(test): " << sizeof(test) << endl;
cout << "addr of a: " << &a << endl;
cout << "addr of b: " << &b << endl;
system("pause");
return 0;
}
如上圖所示,這個佔位位元組僅僅是用來佔位。
空白基類最優化:
#include<iostream>
using namespace std;
class test
{
};
class derive :public test
{
private:
int a;
};
int main()
{
test a, b;
cout << "sizeof(test): " << sizeof(test) << endl;
cout << "sizeof(derive): " << sizeof(derive) << endl;
cout << "addr of a: " << &a << endl;
cout << "addr of b: " << &b << endl;
system("pause");
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優化物件佈局.
注意:空白基類最優化無法被施加於多重繼承上只適合單一繼承。
多繼承:
#include<iostream>
using namespace std;
class test1
{
};
class test2
{
};
class derive1 :public test1
{
private:
int a;
};
class derive2 :public test1,public test2
{
private:
int b;
};
int main()
{
cout << "sizeof(test): " << sizeof(test1) << endl;
cout << "sizeof(derive): " << sizeof(derive1) << endl;
cout << "sizeof(derive): " << sizeof(derive2) << endl;
system("pause");
return 0;
}