關(guān)于內(nèi)存布局的作業(yè)

class Fruit{
   int no;
   double weight;
   char key;
public:
   void print() {   }
   virtual void process(){   }
};
   
class Apple: public Fruit{
   int size;
   char type;
public:
   void save() {   }
   virtual void process(){   }
};

在vs平臺下的話,F(xiàn)ruit的size應(yīng)為32,Apple的size為40

下面給出具體的說明
首先我們先來看一下這兩種類的具體內(nèi)存模型

內(nèi)存布局.png

首先,根據(jù)Fruit的類圖我們可以發(fā)現(xiàn),該類的占用空間由兩部分組成,1部分是數(shù)據(jù)成員,一部分是虛表。
在vs下,虛表指針的大小為4,gcc下似乎是8,這個記得不是很清楚了,但是這個完全可以寫一個example虛基類來獲取它的大小來判斷
接下來算一下數(shù)據(jù)成員的大小4(int)+double(8)+char(1)= 13,13+4(虛表指針)= 21 跟我們的真實結(jié)果相差甚遠(yuǎn),其實這是因為c++類中的內(nèi)存布局自動對齊
在默認(rèn)的情況下,c++類中以其最大數(shù)據(jù)成員的大小為對齊量進(jìn)行對齊,在這里double是最大,為8
所以真實的布局是這樣的:
int 4 double只能從8的整數(shù)偏移量處存放,所以int擴(kuò)展至 8
double 8
char 1 擴(kuò)展至8
虛表指針 4 由于整體大小需要時8的倍數(shù),擴(kuò)展到8
總共 32字節(jié)

同理,對于Apple類,我們有
Fruit類 32
size 4
key 1 由于整體大小是8的倍數(shù),擴(kuò)展到8
所以是40

附上測試程序:

#include <iostream>
//#pragma pack(8)
class Fruit{
//  test
    int no;
    double weight;
    char key;
public:
    void print() {   }
    virtual void process(){   }
};

class Apple : public Fruit{
    int size;
    char type;
//  int dd;
//  int s;
public:
    void save() {   }
    virtual void process(){   }
};
class example
{
    virtual void test(){}
};

int main(void)
{
    
    std::cout << "example " << sizeof(example) << std::endl;
    std::cout << "apple " << sizeof(Apple) << std::endl;
    std::cout << "fruit" << sizeof(Fruit) << std::endl;
//  std::cout << "double " << sizeof(double) << std::endl;
    system("pause");
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容