1. 程式人生 > >對c++型別做sizeof操作結果及分析

對c++型別做sizeof操作結果及分析

關於C++物件的記憶體佈局,網上有很多的文章可以參考,寫的比較好的是陳浩的兩篇:

C++ 物件的記憶體佈局

C++ 物件的記憶體佈局

這裡只討論c++裡面類用sizeof取值的輸出問題。

有這麼一個面試題:下面這段程式碼的輸出是什麼?

#include<stdio.h>
class A
{
  int a;
  char b;
  virtual void doing()=0;
};

int main()
{
    printf("%d\n",sizeof(A));
    return 0;
}

32位機器上,linux+gcc編譯執行的結果是12。因為char要與int保持地址對齊,需要4位元組,而虛擬函式表指標為4位元組,

所以輸出結果是4+4+4=12;

如果doing()函式有自身的實現,不是純虛擬函式呢,輸出也是12,只不過這時候虛擬函式表指標指向的虛擬函式表已經有了具體的函式入口地址,而不是NULL;

如果A的定義是這樣的:

class A
{
  int a;
  char b;
  void doing()=0;
};
這時候輸出結果就是8了,我的理解是sizeof(A)相當於sizeof(a),而a是A類的一個物件,sizeof()操作只會計算成員變數和虛擬函式表指標所佔用的記憶體空間。

普通方法(無論是否是static的),都不會計算在sizeof的結果內,類的static變數也不會計算在sizeof結果內。他們在記憶體裡面都只有一份,儲存在靜態儲存區。

讀者可以試試下面的A類定義,執行下看看輸出結果是什麼。

#include<stdio.h>
class A
{
  int a;
  char b;
  void doing(){
   int a;
   }
  static double f;
  static void func()
  {
  float fl;
  }
};

int main()
{
    printf("%d\n",sizeof(A));
    return 0;
}
歡迎留言與討論,有什麼不對的地方請儘管指出。