sizeof(空類)問題總結
阿新 • • 發佈:2019-02-06
警鐘長鳴
在秋招時參加並通過了科大訊飛的筆試,一面就是技術面,被問到 C++中sizeof(空類)這種問題,等回到宿舍,我才發現,這是劍指offer上的一個題。從此惡補劍指offer。最終估計是薪資說14K,要的太高了,完全不瞭解合肥的消費水平,都是教訓啊。。。
問題描述:
- 定義一個空的型別,裡面沒有任何成員變數和成員函式。對該型別求sizeof,得到的結果時多少?
- 在該類中新增建構函式和解構函式,再對該型別求sizeof,得到的結果時多少?
- 如果解構函式標記為虛擬函式呢?再對該型別求sizeof,得到的結果時多少?
程式碼驗證
#include <iostream>
using namespace std;
//空類
class classA
{
classA(){}
~classA(){}
};
//sizeof(classB)為1B
class classB :public classA
{ };
//定義一個成員變數,4B大小
class classC
{
private:
int a;
};
//sizeof(classD)為8B
class classD :public classC
{
public:
virtual void funtion1() {}
};
class classE
{
public:
//virtual classE(){} //error,建構函式不能為虛擬函式
virtual ~classE(){} //解構函式可以是虛擬函式
};
int main()
{
cout << sizeof(classA) << " ";
cout << sizeof(classB) << " ";
cout << sizeof(classC) << " ";
cout << sizeof(classD) << " ";
cout << sizeof(classE) << endl;
system("pause" );
return 0;
}
結果分析
- 第一問:答案是1B,而不是0B。我們在宣告該型別例項的時候,必須給例項在記憶體中分配一定的空間,否則無法使用該例項。由於空型別不含任何資訊,故而所佔的記憶體大小由編譯器決定。codeblocks和Visual Studio中每個空型別的例項佔1B。切忌:一旦類中有其他的佔用空間成員,則這1個位元組就不在計算之內。
- 第二問:在該類中新增建構函式和解構函式,再對該型別求sizeof,結果仍未1B。因為成員函式只與型別相關,而與具體例項無關。進一步引申:如果有其他成員函式(非虛擬函式),則還是隻佔用1個位元組。
- 第三問:C++編譯器一旦發現型別中有虛擬函式,就會為該型別生成虛擬函式表,並在該型別的每個例項中新增一個指向虛擬函式表的指標。在32位的機器上,一個指標佔4B;在64位的機器上,一個指標佔8B。為何需要虛擬函式表?因為虛擬函式表是C++實現多型的一種機制。具體見下面的連結:
C++多型的實現機制——虛擬函式