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

2016-06-04  本文已影响27人  PatrickHC

写在前面:感谢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; 
}; 
上一篇下一篇

猜你喜欢

热点阅读