【C++深度剖析教程28】C++对象模型分析
學習交流加
- 個人qq:
 1126137994
- 個人微信:
 liu1126137994
- 學習交流資源分享qq群:
 962535112
今天記錄學習的內容是:C++對象模型分析!!!
本質分析:
 class是一種特殊的struct
- 在內存中class依舊可以看做是變量的集合
- class與struct遵循相通的對齊準則
- class中的成員函數與成員變量是分開存放的
 *每個對象有獨立的成員變量
 *所有對象共享類中的成員函數
 下圖中的結果是什么?
 
上面的結果需要分情況討論,但是不管結果是多少,它們兩個都是相等的,因為class本身就是一種特殊的struct。
 下面來總結一下,結構體的字節對齊,以及它在不同編譯器中的不同的對齊方式!
Linux系統下:GCC默認為4字節對齊,有多個低字節類型的變量(這多個低字節類型(低于字節對齊的大小)的變量是連續存儲的,中間沒有其他高于4字節類型變量),則這多個低字節類型的變量組成后的字節總數,再與4字節對齊(即4的倍數)
 windows下的VS編譯器:以最高字節類型的字節數對齊,同理有多個低字節類型的變量的話(這多個低字節類型的變量(低于對齊字節的大小)是連續存儲的,中間沒有其他類型變量),加在一起再與最大類型字節數做對比(即最大字節數的倍數)
注:
 如果是這種情況下:
則char s 與int a 合并后的字節總署為5<8,所以char s與int a 合并后再與8字節對齊,所以該結構體的字節數為16,而不是24;
 下面看一個例子:
運行結果如下:
 
注意:以上是在linux上用gcc編譯器進行編譯,所以結構體的對齊方式是以4字節的對齊的,所以結果為20字節,如果放到vs上編譯,那么該結構體的大小就為24字節。
同時,我們可以看出,我們可以通過將結構體指針指向類對象來直接操作對象,這也說明了,class是一種特殊的結構體!!!
結論:
 運行時的對象,退化為結構體的形式:
下面再看一個例子,來探討C++中對象的本質:
以下C程序是用來模擬C++中的對象模型的:
 50-2.h為:
50-2.c為:
#include "50-2.h" #include "malloc.h"struct ClassDemo {int mi;int mj; };Demo* Demo_Create(int i, int j) {struct ClassDemo* ret = (struct ClassDemo*)malloc(sizeof(struct ClassDemo));if( ret != NULL ){ret->mi = i;ret->mj = j;}return ret; }int Demo_GetI(Demo* pThis) {struct ClassDemo* obj = (struct ClassDemo*)pThis;return obj->mi; }int Demo_GetJ(Demo* pThis) {struct ClassDemo* obj = (struct ClassDemo*)pThis;return obj->mj; }int Demo_Add(Demo* pThis, int value) {struct ClassDemo* obj = (struct ClassDemo*)pThis;return obj->mi + obj->mj + value; }void Demo_Free(Demo* pThis) {free(pThis); }main.c為:
#include <stdio.h> #include "50-2.h"int main() {Demo* d = Demo_Create(1, 2); // Demo* d = new Demo(1, 2);printf("d.mi = %d\n", Demo_GetI(d)); // d->getI();printf("d.mj = %d\n", Demo_GetJ(d)); // d->getJ();printf("Add(3) = %d\n", Demo_Add(d, 3)); // d->add(3);// d->mi = 100;Demo_Free(d);return 0; }以上c程序,實現了C++對象的概念,等價于下面的C++程序:
#include <iostream> #include <string>using namespace std;class Demo {int mi;int mj; public:Demo(int i, int j){mi = i;mj = j;}int getI(){return mi;}int getJ(){return mj;}int add(int value){return mi + mj + value;} };int main() {Demo d(1, 2);cout << "sizeof(d) = " << sizeof(d) << endl;cout << "d.getI() = " << d.getI() << endl;cout << "d.getJ() = " << d.getJ() << endl;cout << "d.add(3) = " << d.add(3) << endl;return 0; }總結:
想獲得各種學習資源以及交流學習的加我:
 qq:1126137994
 微信:liu1126137994
 可以共同交流關于嵌入式Linux,操作系統,C++語言,C語言,數據結構與算法等技術問題。
總結
以上是生活随笔為你收集整理的【C++深度剖析教程28】C++对象模型分析的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Web页面引入思源黑体
- 下一篇: mutable、volatile的使用
