【C/C++】【類和對象】計算類所佔的字節數

空類

空類

#include <iostream>
using namespace std;

class Base
{
    void f(){};
};

int main()
{
    cout << sizeof(Base) << endl; //1
    return 0;
}


虛繼承空類的類大小

#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;

class Base
{
    void f(){};
};

class Derived2 : public virtual Base
{
    void d2();
};


int main()
{
    cout << sizeof(Derived2) << endl; //8 64位下 有一個指向虛基類的指針
    return 0;
}

虛函數

#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;

class Base
{
    virtual void f(){};
};

class Derived1 : public Base
{
    void d1();
};

class Derived2 : public Base
{
    virtual void d2();
};


int main()
{
    cout << sizeof(Base) << endl; //8 64位下 有一個指向虛函數表的指針
    cout << sizeof(Derived1) << endl; //8 64位下 有一個指向虛函數表的指針
    cout << sizeof(Derived2) << endl; //8 64位下 有一個指向虛函數表的指針
    return 0;
}

虛函數 + 虛繼承

#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;

class Base
{
    virtual void f(){};
};

class Derived1 : public Base
{
    void f1();
};

class Derived2 : public Base
{
    virtual void f2();
};

class Derived3 : public virtual Base
{
    virtual void f3();
};

int main()
{
    cout << sizeof(Base) << endl; //8 64位下 有一個指向虛函數表的指針
    cout << sizeof(Derived1) << endl; //8 64位下 有一個指向虛函數表的指針
    cout << sizeof(Derived2) << endl; //8 64位下 有一個指向虛函數表的指針
    //每個虛繼承的子類都有一個虛基類指針和虛基類表
    //虛繼承 並且有虛函數 跟編譯器有關係
    //vs是24(64位) 基類的虛函數表指針 自己的虛函數表指針 指向虛基類的指針
    //gcc是8(64位) ???有點疑惑
    cout << sizeof(Derived3) << endl; 
    return 0;
}

成員變量

有成員變量的類

#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;

class Base
{
public:
    int a;
    int b;
    virtual void f(){};
};

class Derived1 : public Base
{
    void f1();
};

class Derived2 : public Base
{
    virtual void f2();
};



int main()
{
    //4 + 4 + 8
    cout << sizeof(Base) << endl; 
    cout << sizeof(Derived1) << endl; 
    cout << sizeof(Derived2) << endl; 


    return 0;
}

靜態成員變量

靜態成員變量不屬於類,計算類大小的時候不用考慮

#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;

class Base
{
public:
    int a;
    int b;
    static int x;
    virtual void f(){};
};

class Derived1 : public Base
{
    void f1();
};

class Derived2 : public Base
{
    virtual void f2();
};



int main()
{
    //4 + 4 + 8
    cout << sizeof(Base) << endl;
    cout << sizeof(Derived1) << endl;
    cout << sizeof(Derived2) << endl;


    return 0;
}

多重繼承

#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;

class Base
{
    virtual void f() {};
};

class Derived1
{
    virtual void f1() {};
};

class Derived2 : public Base, Derived1
{
    virtual void f2() {};
};


int main()
{
    cout << sizeof(Base) << endl; //8 64位下 有一個指向虛函數表的指針
    cout << sizeof(Derived1) << endl; //8 64位下 有一個指向虛函數表的指針
    cout << sizeof(Derived2) << endl; //16 64位下 多個虛函數表指針 ??? 
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章