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

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

作者: PatrickHC | 来源:发表于2016-06-04 14:20 被阅读27次

    写在前面:感谢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学习笔记-第四周 关于面向对象的编程与设计

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