c++ 空類大小不爲0的原因

<span style="font-size:18px;">#include<iostream>
using namespace std;

class a{};

class b{};

class c:public a{
	virtual void fun()=0;
};

class d:public b,public c{
};

int main(){
	cout<<sizeof(a)<<endl;
	cout<<sizeof(b)<<endl;
	cout<<sizeof(c)<<endl;
	cout<<sizeof(d)<<endl;
	return 0;
}</span>

此例VC2010運行結果爲1   1    4    8;codeblocks運行結果爲1   1    4    4

爲什麼會出現這種結果呢?類a,b明明是空類,它的大小應該爲0,爲什麼編譯器輸出的結果爲1呢?這就是我們所要說的實例化的原因(空類同樣可以被實例化),每個實例在內存中都有一個獨一無二的地址,爲了達到這個目的,編譯器往往會給一個空類隱含的加一個字節,這樣空類在實例化後在內存得到了獨一無二的地址.所以a,b的大小爲1.

類c是由類a派生而來,它裏面有一個純虛函數,由於有虛函數的原因,有一個指向虛函數的指針(vptr),在32位的系統分配給指針的大小爲4個字節,所以最後得到c類的大小爲4.

類d是由類b,c派生而來,它的大小應該爲二者之和5,爲什麼卻是8或者4呢?這是因爲爲了提高實例在內存中的存取效率,類的大小往往被調整到系統的整數倍,並採取就近的法則,離哪個最近的倍數,就是該類的大小,所以類d的大小爲8個字節.當然在不同的編譯器上得到的結果可能不同(此處因爲codeblocks自身有內存優化的機制)。但是這個實驗告訴我們,不管類是否爲空類,均可被實例化(空類也可被實例化),每個被實例都有一個獨一無二的地址,每個非純虛類都能被實例化(即使是空類),類的實例化包括兩個過程,其一:new sizeof(類);其二,調用類的構造函數。所以類的大小必須大於0,才能返回一個有效地址。 


#include<iostream>
using namespace std;

class a{
private:
    int data;
};

class b{
private:
    int data;
    static int Data;
};

int b::Data=0;
int main(int  argc,char* argv[]){
    cout<<sizeof(a)<<endl;
    cout<<sizeof(b)<<endl;
}
此例VC2010運行結果爲4    4;codeblocks運行結果爲4    4

爲什麼類b多了一個數據成員卻和類a的大小相同呢?因爲類b的靜態數據成員被編譯器放在程序的一個全局靜態存儲區,它是類的一個數據成員.但是它不影響類的大小,不管這個類實際產生了多少實例,還是派生了多少新的類,靜態成員數據在類中永遠只有一個實體存在,而類的非靜態數據成員只有被實例化的時候,他們才存在.但是類的靜態數據成員一旦被聲明,無論類是否被實例化,它都已存在.可以這麼說,類的靜態數據成員是一種特殊的全局變量,所以a,b的大小相同.


#include<iostream>
using namespace std;

class a{
private:
    int data;
    int Data;
public:
    a(int key){data=key;}
    ~a(){}
    void fun(int x){
        cout<<x<<endl;
    }
};

class b{
private:
    int data;
    int Data;
    static int data1;
};

int b::data1=0;
int main(int  argc,char* argv[]){
    a A(10);
    A.fun(5);
    cout<<sizeof(a)<<endl;
    cout<<sizeof(b)<<endl;
}
此例VC2010運行結果爲5  8  8;codeblocks運行結果爲5  8  8

它們的結果均相同,可以看出類的大小與它當中的構造函數,析構函數,以及其他的成員函數無關,只與它當中的成員數據有關.

從以上的幾個例子不難發現類的大小:

1、爲類的非靜態成員數據的類型大小之和.

2、有編譯器額外加入的成員變量的大小,用來支持語言的某些特性(如:指向虛函數的指針).

3、爲了優化存取效率,進行的邊緣調整.

4、與類中的構造函數,析構函數以及其他的成員函數無關.


轉載自:http://tc.uc.cn/?src=http%3A%2F%2Fhi.baidu.com%2Ftangsu2009%2Fitem%2Fc607a91646d15f4ce75e06f0&restype=1&ucshare=1&ucshareplatform=-1&country=cn#userconsent#




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章