天天看點

如果一個class中包含一個vector容器,那麼sizeof(class_name)的值應該怎麼算?

1、如果一個class中包含一個vector容器,那麼sizeof(class_name)的值應該怎麼算?

#include <iostream>
#include <vector>

using namespace std;

class CDocument{
public:
    int i;
    vector<long long> vec;
};


int main(){
    CDocument mydoc;
    cout << sizeof(mydoc.vec) << endl; //12
    cout << sizeof(CDocument) << endl; //16,即12+4
    for(int i = 1; i <= 5; i++)
        mydoc.vec.push_back(i);
    cout << sizeof(CDocument) << endl; //16
    cout << sizeof(mydoc) << endl;     //16
}
           

題目中所描述的是C++類與類關系的一種:叫做Composition(複合),是以在計算sizeof(class_name)的值時,隻需要将複合的類展開,展開以後再按照傳統的計算單個類的sizeof(class_name)去進行計算就可以了。

圖示如下:

如果一個class中包含一個vector容器,那麼sizeof(class_name)的值應該怎麼算?

2、複合關系的構造和析構順序

關于複合關系,我們還需要明白的是,對象的構造和析構的過程中兩個類的構造函數和析構函數的先後順序是什麼樣子的,其實就和繼承時構造和析構的順序類似,見圖:

如果一個class中包含一個vector容器,那麼sizeof(class_name)的值應該怎麼算?

注意圖中紅字的部分是編譯器來幫我們做的。

3、複合關系的記憶體回收

是以當我們在一個class A中放置了一個容器(假設vector<int> vec)時,當我們使用A建立了一個對象obj,并且有一個指針ptr指向了obj,此時delete ptr,就會調用A的析構函數,而此時編譯器也幫助我們去調用容器的析構函數,來完成整個記憶體的回收,這個過程并不需要我們人為的使用vec.clear()來回收vector的記憶體。