1. 程式人生 > >建立一個類佔用的位元組數

建立一個類佔用的位元組數

本文主要講解在C++中建立一個新類會佔用的位元組數,這是面試中經常會被問的一道題。

1.建立一個空類,裡面什麼都沒有,沒有成員函式,也沒有成員變數;

#include <iostream>
using namespace std;

class Person{
    
};

int main(){
    cout<<sizeof(Person)<<endl;
    return 0;
}

返回的結果是:

所以說,建立一個空的類,佔用一個位元組數。因為C++要求每個例項在記憶體中都要有獨一無二的地址。

2.類中有成員變數(非靜態),沒有靜態成員變數和成員函式

#include <iostream>
using namespace std;

class Person{
private:
    int weight;
    int height;
};

int main(){
    cout<<sizeof(Person)<<endl;
    return 0;
}

結果是:

這很容易解釋,因為int型佔用4個位元組,兩個int就佔用8個位元組。那空類的那1個位元組去哪裡了? 那個位元組是隱藏的,當有成員變數或虛擬函式佔用空間時,它就消失了。

3.類中含有靜態成員變數

#include <iostream>
using namespace std;

class Person{
private:
    static int weight;
    int height;
};

int main(){
    cout<<sizeof(Person)<<endl;
    return 0;
}

結果:

哦,原來靜態的成員變數不佔用位元組數。為什麼會不佔用位元組數呢?因為靜態成員變數不在類的內部空間,而在類的外部靜態區,所以計算類的大小時,是不包含靜態變數的大小的。

4.類中只有普通成員函式

#include <iostream>
using namespace std;

class Person{
public:
    void eat();
};

int main(){
    cout<<sizeof(Person)<<endl;
    return 0;
}

結果:

可以看出,普通函式是不佔用類的記憶體空間的。因為我們訪問類的成員函式,是通過eat(Person.this)來呼叫的,也就是說,通過這個this指標指向一個table,這個table儲存的是各個成員函式的地址。

5.類中存在虛擬函式

#include <iostream>
using namespace std;

class Person{
public:
    void eat();
    virtual void run();
};

int main(){
    cout<<sizeof(Person)<<endl;
    return 0;
}

在32位系統中,結果是4; 在64位系統下是8。  這個大小也就是虛擬函式表指標的大小。無論有多少個虛擬函式,無論衍生出多少個子類,都只存在一個虛擬函式表的指標。這個指標存放的是虛擬函式表在記憶體中的地址。

6.類中資料對齊處理

#include <iostream>
using namespace std;

class Person{
public:
    void eat();
private:
    char sex;
    int height;
    int weight;
};

int main(){
    cout<<sizeof(Person)<<endl;
    return 0;
}

結果是:

雖然有一個char型別,本身只佔一個位元組,但是為了和int對齊,自動變為和int 相同的大小,所以佔用的位元組數為12