C++ 類里面,函數占用存儲空間問題


  轉載自:http://blog.163.com/xping_lsr/blog/static/19654034520119804131721/

先看兩段代碼:


代碼段1:
class A
{
public:
int print(){ cout<<"This is A"<<endl;}
};
inr main()
{
A a;
cout << "Size of A = " << sizeof(a) << endl;
}

輸出結果:
Size of A =1

代碼段2:

class A
{
public:
int print1(){ cout<<"This is A"<<endl;}
int print2(){ cout<<"This is A"<<endl;}
int print3(){ cout<<"This is A"<<endl;}
};
inr main()
{
A a;
cout << "Size of A = " << sizeof(a) << endl;
}

輸出結果:
Size of A =1

對象的大小是它的數據成員所占存儲空間之和,就和結構體一樣。類中的函數是所有該類對象通用的方法,不算作對象的成員,因此也不算在對象的存儲空間內

問題:類里面不管有多少個函數,這個類的對象只占1個字節的內存。這個字節的內存的內容是什么?是指針嗎?指針不是占4個字節嗎?

當類中類有定義任何變量的時候,類的對象都是1個字節的,當類中沒有任何變量的時候,這個類里沒有任何真正的成員變量,所以大小應該是0,但0大小不好在內存中定位一個地址,所以,就規定它大小為0的對象要占一字節空間,以便讓它擁有一個合法的地址。如果是有派生類的,還有考慮到內存對齊的問題的。

另外涉及到虛函數的話又不一樣了。如

class A
{
public:
virtual int print(){ cout<<"This is A"<<endl;}
};
如果sizeof(A)的話,得出的是4。

原因是涉及到虛函數的實現問題。

class Class1

{

    m_data1;

   m_data2;

  virtual vfunc1()

  virtual vfunc2()

  virtual vfunc3()

};

 

Class1對象實例

vptr

m_data1

m_data2

通過vptr指針找到虛函數表

 

Vtable(虛函數表)

(*vfunc1)()

(*vfunc2)()

(*vfunc3)()

 

Class1::vfunc1()

Class1::vfunc2()

Class1::vfunc3()

 

 

所以回到原來的問題,A中只有一個或者幾個虛函數的話,沒有成員變量,那么類A相當於含有一個vptr指向虛函數表的指針,所以sizeof(A)=4。

 

還有一點,如

class B

{

};

class B2

{

};

class C:public B

{

};

class D:public virtual B

{

};

class E:public B,public B2

{

};

sizeof(B) = 1;   sizeof(B2) = 1;  sizeof(C) = 1;  sizeof(D) = 4;  sizeof(E) = 1;

空類所占空間為一(上文以解釋),單一繼承的空類空間也是1,多重繼承的空類空間還是1,但是虛繼承涉及到虛表(虛指針),所以sizeof(D)=4。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM