這是劍指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