1. 程式人生 > 實用技巧 >C++ sizeof()函式二——類在記憶體中的分佈

C++ sizeof()函式二——類在記憶體中的分佈

/**
* @file classcode _sizeof.cpp
* @brief    1.空類的大小隻有一個位元組。
*           2.一個類中,成員函式(包括靜態與非靜態)和靜態資料成員都是不佔用類物件的儲存空間。
*           3.類中存在虛擬函式,虛擬函式本身並不佔用類物件的記憶體空間,但是有一個指向虛擬函式的虛指標,即佔用vptr的大小;並且無論存在多少虛擬函式,都只有一個vptr的大小
*           4.普通繼承,派生類繼承了所有基類的函式與成員,要按照位元組對齊來計算大小
*           5.虛擬函式繼承,不管是單繼承還是多繼承,都是繼承了基類的vptr。(32位作業系統4位元組,64位作業系統 8位元組)!
*           6.虛繼承,繼承基類的vptr。
* @author major
* @version v1
* @date 2020-07-07
**/

#include<iostream>

using namespace std;

class A{};  //1
class B{
    public:
        char b;
        static int c;
        static int d;
        static int f;
};//1
class C{
    public:
        char b;
        virtual void fun() {};
};//16
class D{
    public:
        char b;
        virtual void fun1() {};
        virtual void fun2() {};
        virtual void fun3() {};
        virtual void fun4() {};
};//16

class E{
    virtual void fun(){}
};//8
class F:public E{
};//8
class G{
    virtual void fun1() {}
};//8
class H : virtual public  E, virtual public G{
    public:
        virtual void fun2() {}
};//16
class I : virtual public  E, virtual public G, virtual public D{
    public:
        virtual void fun3() {}
};//32

int main(){
    //brief 1.空類的大小隻有一個
    cout << "debug: sizeof(A) = " << sizeof(A) << endl;
    //brief 2.
    cout << "debug: sizeof(B) = " << sizeof(B) << endl;
    //brief 3.
    cout << "debug: sizeof(C) = " << sizeof(C) << endl;
    cout << "debug: sizeof(D) = " << sizeof(D) << endl;
    //brief 4,5
    cout << "debug: sizeof(E) = " << sizeof(E) << endl;
    cout << "debug: sizeof(F) = " << sizeof(F) << endl;
    //brief 6
    cout << "debug: sizeof(G) = " << sizeof(G) << endl;
    cout << "debug: sizeof(H) = " << sizeof(H) << endl;
    cout << "debug: sizeof(I) = " << sizeof(I) << endl;
    return 0;
}