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
  • 一個博客,這個博客記錄了他讀這本書的筆記,總結得不錯?!渡疃忍剿鰿++對象模型》筆記匯總 1. C++對象模型與內...
    Mr希靈閱讀 5,642評論 0 13
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,767評論 18 399
  • struct與class的區別 C的struct與C++的class的區別:struct只是作為一種復雜數據類型定...
    geekzph閱讀 1,609評論 0 4
  • 看完了『我的危險妻子』。真利亞氣質超美啊,男主智商真是著急。 渾身都是汗,這天氣我服。 還有,明天起該努力了,至少...
    乀丶閱讀 168評論 0 0