1. 程式人生 > >C++中空類佔一位元組原因詳解

C++中空類佔一位元組原因詳解

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