GeekBand学习笔记-第四周 关于面向对象的编程与设计

写在前面:感谢GeekBand提供这样好的学习机会,让我在繁忙的工作之余可以学习巩固c++知识。以下是边学边记的一些扩展点。分享给大家。

关于对象的大小

只有非静态成员数据会占用对象内存空间
class A {
private:
        float iMem1;                   
        const int iMem2;
        static int iMem3;          \\ 这个对象不会占用此内存空间
        char iMem4;
};
注意成员数据的顺序
class C1 {
        char c;           \\ C1共占用24个字节,这里char 只占用一个字节,
        int int1;         \\ 但是由于下一个数据是int,占4个字节,所以会浪费3个字节
        int int2;
        int i;
        long l;
        short s;
};

class C2 {
        int int1;
        int int2;
        int i;
        long l;
        short s;
        char c;          \\ 这样一来,C2共占用20个字节
};

再看继承类

Class B { \\8个字节
...
        int iMem1;
        int iMem2;
}

Class D: public B { \\由于继承了B(8个字节),所以一共有12个字节
...
        int iMem;
}

带有虚函数

class Base { \\ 8个字节:int 4个字节+ 虚指针4个字节
public:
...
        virtual void SomeFunction(...);
private:
        int iAMem
};

class Derived : public Base {
...
        virtual void SomeOtherFunction(...);
private:
        int iBMem
};

不同编译器

下面例子里的派生类,如果用微软编译器编译,大小有16个字节;
如果用gcc编译,大小只有12个字节。
不过,由于微软C++采用了4字节对齐地址,所以访问类成员会更容易。

class BaseClass {
        int a;
        char c;
};

class DerivedClass : public BaseClass {
        char d;
        int i;
};

带有虚继承

\\4个字节
class ABase{                                        
        int iMem;            \\4个字节
}; 
\\12个字节:(ABase+BBase+Vptr)
class BBase : public virtual ABase {      \\ABase4个字节,BBase4个字节,        
        int iMem;                         \\4个字节Virtual Base Pointer
}; 
\\12个字节:(ABase+CBase+Vptr)
class CBase : public virtual ABase {      \\ABase4个字节,CBase4个字节,   
        int iMem;                         \\4个字节Virtual Base Pointer
}; 
\\24个字节:由于只有一个虚指针,那么这个类的大小就是(BBase+CBase+int+Vptr)
class ABCDerived : public BBase, public CBase { 
        int iMem; 
}; 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 写在前面:感谢GeekBand提供这样好的学习机会,让我在繁忙的工作之余可以学习巩固c++知识。以下是边学边记的一...
    PatrickHC阅读 234评论 0 1
  • 一个博客,这个博客记录了他读这本书的笔记,总结得不错。《深度探索C++对象模型》笔记汇总 1. C++对象模型与内...
    Mr希灵阅读 5,616评论 0 13
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,760评论 18 399
  • struct与class的区别 C的struct与C++的class的区别:struct只是作为一种复杂数据类型定...
    geekzph阅读 1,609评论 0 4
  • 看完了『我的危险妻子』。真利亚气质超美啊,男主智商真是著急。 浑身都是汗,这天气我服。 还有,明天起该努力了,至少...
    乀丶阅读 168评论 0 0