写在前面:感谢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;
};
网友评论