一般咱們定義一個類,它所佔的空間有多大呢?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 }
獲得結果: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 }
咱們發現,多了4個字節。這是由於虛函數要爲對象分配一個虛函數表vptr,經過這個指針來調用虛函數。所以有虛函數的類,會多出一個指針的空間。但僅僅分配一個指針。好比第一個函數會用vptr[1]來表示,第二個用vptr[2]來表示,而索引0是表的信息。blog
若有不對的地方,還請多多指正。索引