c++中類長度解析

  一般咱們定義一個類,它所佔的空間有多大呢?html

首先咱們看一下下面的這個類ide

class A{ public: void func1(void){ printf("11111heihei\n"); }; void func2(void){ printf("11111heihei\n"); }; public: int number; };
class B{ public: void func1(void){ printf("heihei\n"); }; void func2(void){ printf("heihei\n"); }; public: char number; int number1; };

 

咱們輸出這兩個類的長度函數

 1 #include <stdio.h>
 2 class A{  3 public:  4     void func1(void){  5         printf("11111heihei\n");  6  };  7     void func2(void){  8         printf("11111heihei\n");  9  }; 10 public: 11     int number; 12 }; 13 class B{ 14 public: 15     void func1(void){ 16         printf("heihei\n"); 17  }; 18     void func2(void){ 19         printf("heihei\n"); 20  }; 21 public: 22     char number; 23     int number1; 24 }; 25 int main(){ 26     printf("A %d B %d\n",sizeof(A),sizeof(B)); 27  getchar(); 28      return 0; 29 }
View Code

 

獲得結果:spa

 

  至於爲何第二個是8,就是內存對齊的問題了,能夠參考以前的內存申請的帖子指針

  咱們發現,一個類的長度是它的變量所佔用的空間,也就是說函數是不佔用空間的。這是由於一個類的變量時屬於對象的,而一個類的函數是屬於這個類的。code

  那麼因對象不一樣而不一樣的虛函數又會怎樣呢?

  咱們接着看下面兩個類:htm

class A{ public: virtual void func1(void){ printf("11111heihei\n"); }; void func2(void){ printf("11111heihei\n"); }; public: int number; }; class B{ public: virtual void func1(void){ printf("heihei\n"); }; virtual void func2(void){ printf("heihei\n"); }; public: int number1; };

 

  按照下面的函數輸出,獲得結果:對象

 1 #include <stdio.h>
 2 class A{  3 public:  4     virtual void func1(void){  5         printf("11111heihei\n");  6  };  7     void func2(void){  8         printf("11111heihei\n");  9  }; 10 public: 11     int number; 12 }; 13 class B{ 14 public: 15     virtual void func1(void){ 16         printf("heihei\n"); 17  }; 18     virtual void func2(void){ 19         printf("heihei\n"); 20  }; 21 public: 22     int number1; 23 }; 24 int main(){ 25     printf("A %d B %d\n",sizeof(A),sizeof(B)); 26  getchar(); 27      return 0; 28 }
View Code

 

 

  咱們發現,多了4個字節。這是由於虛函數要爲對象分配一個虛函數表vptr,經過這個指針來調用虛函數。所以有虛函數的類,會多出一個指針的空間。但僅僅分配一個指針。好比第一個函數會用vptr[1]來表示,第二個用vptr[2]來表示,而索引0是表的信息。blog

  若有不對的地方,還請多多指正。索引

相關文章
相關標籤/搜索