美文网首页
关于内存布局的作业

关于内存布局的作业

作者: 七七的面包在流浪 | 来源:发表于2016-03-25 05:32 被阅读0次
    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平台下的话,Fruit的size应为32,Apple的size为40

    下面给出具体的说明
    首先我们先来看一下这两种类的具体内存模型

    内存布局.png

    首先,根据Fruit的类图我们可以发现,该类的占用空间由两部分组成,1部分是数据成员,一部分是虚表。
    在vs下,虚表指针的大小为4,gcc下似乎是8,这个记得不是很清楚了,但是这个完全可以写一个example虚基类来获取它的大小来判断
    接下来算一下数据成员的大小4(int)+double(8)+char(1)= 13,13+4(虚表指针)= 21 跟我们的真实结果相差甚远,其实这是因为c++类中的内存布局自动对齐
    在默认的情况下,c++类中以其最大数据成员的大小为对齐量进行对齐,在这里double是最大,为8
    所以真实的布局是这样的:
    int 4 double只能从8的整数偏移量处存放,所以int扩展至 8
    double 8
    char 1 扩展至8
    虚表指针 4 由于整体大小需要时8的倍数,扩展到8
    总共 32字节

    同理,对于Apple类,我们有
    Fruit类 32
    size 4
    key 1 由于整体大小是8的倍数,扩展到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;
    }
    

    相关文章

      网友评论

          本文标题:关于内存布局的作业

          本文链接:https://www.haomeiwen.com/subject/kynrlttx.html