1. 程式人生 > >sizeof(空類)問題總結

sizeof(空類)問題總結

警鐘長鳴

在秋招時參加並通過了科大訊飛的筆試,一面就是技術面,被問到 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; }

運算結果

結果分析

  1. 第一問:答案是1B,而不是0B。我們在宣告該型別例項的時候,必須給例項在記憶體中分配一定的空間,否則無法使用該例項。由於空型別不含任何資訊,故而所佔的記憶體大小由編譯器決定。codeblocks和Visual Studio中每個空型別的例項佔1B。切忌:一旦類中有其他的佔用空間成員,則這1個位元組就不在計算之內。
  2. 第二問:在該類中新增建構函式和解構函式,再對該型別求sizeof,結果仍未1B。因為成員函式只與型別相關,而與具體例項無關。進一步引申:如果有其他成員函式(非虛擬函式),則還是隻佔用1個位元組。
  3. 第三問:C++編譯器一旦發現型別中有虛擬函式,就會為該型別生成虛擬函式表,並在該型別的每個例項中新增一個指向虛擬函式表的指標。在32位的機器上,一個指標佔4B;在64位的機器上,一個指標佔8B。為何需要虛擬函式表?因為虛擬函式表是C++實現多型的一種機制。具體見下面的連結:
    C++多型的實現機制——虛擬函式

重要參考