**代碼:**
****
~~~
#include<iostream>
using namespace std;
class A
{
};
class B
{
char a;
int b;
};
class C
{
void foo(){};
};
class D
{
virtual void foo(){};
};
int main()
{
cout<<sizeof(A)<<sizeof(B)<<sizeof(C)<<sizeof(D);
return 0;
}
~~~
**疑**:結果是什么,為什么呢?
解答:sizeof(A)為1,而不是0,雖然空類沒有任何成員變量,但其實體提供取地址操作,所以其內存空間不能為0。sizeof(B)為8,編譯器在計算類體或結構體變量的地址時是通過字節對齊的方式進行的,也就是通過加多少偏移量來確認是那個變量。類的偏移量為其最大內存空間的類型的成員變量的長度,其最大內存空間類型成員是int,所以偏移量為4字節,即char a成員需要補上3個字節,才能讓編譯器準確高效地尋址,再加上int的4字節,sizeof(B)就是8了。sizeof(C)為1,類的成員函數在編譯器編譯時,其函數地址就已自動存放,所以不必為其分配額外的空間來存放他,所以它的長度跟空類一樣為1。sizeof(D)為4,因為類D需要構造一虛函數列表來存放函數指針以實現動態調用,一個指針的長度占用4個字節,所以為4.
======= welcome to my HomePage([*http://blog.csdn.net/zhanxinhang*](http://blog.csdn.net/zhanxinhang)) to have a?communication =======