C++之類成員所占內存大小問題總結


1.空類所占字節數為1,可見代碼如下

#include <iostream>
using namespace std;

class Parent
{

};

class Child:public Parent
{
public:
    int b ;
};

int main(int argc, char* argv[])
{
    Child b;
    Parent a;

    cout << "a.sizeof = " << sizeof(a) << endl;
    cout << "b.sizeof = " << sizeof(b) << endl;

    system("pause");
    return 0;
}

打印結果為:

  

分析:

  為了能夠區分不同的對象,一個空類在內存中只占一個字節

  在子類繼承父類后,如果子類仍然是空類,則子類也在內存中指針一個字節;

           如果子類不是空類,則按照成員變量所占字節大小計算。

 

2.類中的成員函數不占內存空間虛函數除外;

#include <iostream>
using namespace std;

class Parent
{
public:
    void func() {};
    void func1() { int a; };
    void func2() { int b; };
};

class Child:public Parent
{
public:
    int b ;
};

int main(int argc, char* argv[])
{
    Child b;
    Parent a;

    cout << "a.sizeof = " << sizeof(a) << endl;
    cout << "b.sizeof = " << sizeof(b) << endl;

    system("pause");
    return 0;
}

輸出結果如下:

  

分析:上述代碼中父類,在內存中仍然只占有一個字節;原因就是因為函數在內存中不占字節;

   但是,如果父類中如果有一個虛函數,則類所字節發生變化,如果是32位編譯器,則占內存四個字節;

#include <iostream>
using namespace std;

class Parent
{
public:
    virtual void func() {};
    virtual void func1() { int a; };
    void func2() { int b; };
};

class Child:public Parent
{
public:
    int b ;
};

int main(int argc, char* argv[])
{
    Child b;
    Parent a;

    cout << "a.sizeof = " << sizeof(a) << endl;
    cout << "b.sizeof = " << sizeof(b) << endl;

    system("pause");
    return 0;
}

輸出結果:

  

分析:

  通過上述代碼可見,編譯器為32時,無論幾個虛函數所占的字節數都為4;

  而子類在內存中占的字節數為父類所占字節數+自身成員所占的字節數;

 

3.和結構體一樣,類中自身帶有四字節對齊功能

#include <iostream>
using namespace std;

class Parent
{
public:
    char a;
    virtual void func() {};
    virtual void func1() { int a; };
    void func2() { int b; };
};

class Child:public Parent
{
public:
    char c;
    int b ;
};

int main(int argc, char* argv[])
{
    Child b;
    Parent a;

    cout << "a.sizeof = " << sizeof(a) << endl;
    cout << "b.sizeof = " << sizeof(b) << endl;

    system("pause");
    return 0;
}

輸出結果:

  

分析:

  Parent類中,char a;占一個字節,虛函數占有四個字節,由於類的字節對齊,所以總共父類占有8個字節;

  子類中,char c 占有一個字節,int 占四個字節,由於字節對齊,本身共占有8字節,再加上父類的8字節,共占有16字節;

 

4.類中的static靜態成員變量不占內存,靜態成員變量存儲在靜態區

#include <iostream>
using namespace std;

class G
{
public:
    static int a;
};

int main(int argc, char * argv[]) 
{
    
    cout << sizeof(G)<<endl;

    system("pause");
    return 0;

}

結果輸出:

  

總結:

  1.空類必須占一個字節;

  2.非虛函數指針不占字節;

  3.虛函數根據編譯器位數,占相應字節,不論虛函數個數,只占一個虛函數的字節;

  4.類具有4字節對齊功能;

  5.類中的靜態成員變量不占類的內存;並且靜態成員變量的初始化必須在類外初始化

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM