天天看點

劍指offer筆記(1)定義一個空類型,裡面沒有任何成員變量和成員函數。對該類型求sizeof 結果?

這是劍指offer第23頁的一個問題:

定義一個空類型,裡面沒有任何成員變量和成員函數。對該類型求sizeof 結果?

結果為1 。

為什麼不是0?

       空類型執行個體中不包含任何資訊,但是當我們聲明該類型的執行個體的時候,它必須在記憶體中占有一定的空間,否則無法使用這些執行個體(你想想,這個執行個體的指針至少要指向一塊記憶體空間吧)。至于占多少空間,由編譯器決定。Visual Studio中每個空類型的執行個體占用1位元組的空間。

如果在該類型中添加一個構造函數和析構函數,再對該類型求sizeof,得到的結果又是多少?

       還是1.調用構造函數和析構函數隻需要知道函數的位址即可,而這些函數的位址隻與類型相關,而與類型的執行個體無關(成員函數是屬于類的,執行個體隻是擁有調用權,而且成員函數的靜态綁定,也是在編譯階段完成的),編譯器也不會因為這兩個函數而在執行個體中添加任何額外的資訊。

如果析構函數标記為虛函數呢?

      C++編譯器一旦發現一個類型中有虛函數,就會為該類型生成虛函數表,并在該類型的每一個執行個體中添加一個指向虛函數表的指針。在32位機器上,一個指針占4個位元組的空間,因而sizeof得到4;如果是64位的機器,一個指針占8位元組的空間,結果為8。

代碼:

#include<iostream>
using namespace std;

class A{
	public:
		A(){	}
		~A(){	}
}; 

int main(){
	
	A a;
	cout << "sizeof(a): " << sizeof(a) << endl;
	
	return 0;
}
           

結果:

sizeof(a): 1
           

代碼:

#include<iostream>
using namespace std;

class A{
	public:
		A(){	}
		virtual ~A(){	}
}; 

int main(){
	
	A a;
	cout << "sizeof(a): " << sizeof(a) << endl;
	
	return 0;
}
           

結果:

sizeof(a): 8