轉載自: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個字節嗎?
另外涉及到虛函數的話又不一樣了。如
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指針找到虛函數表
|
|
Vtable(虛函數表)
|
|
所以回到原來的問題,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。
