寫在前面:感謝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;
};