【C++深度剖析教程28】C++对象模型分析
學(xué)習(xí)交流加
- 個(gè)人qq:
1126137994 - 個(gè)人微信:
liu1126137994 - 學(xué)習(xí)交流資源分享qq群:
962535112
今天記錄學(xué)習(xí)的內(nèi)容是:C++對(duì)象模型分析!!!
本質(zhì)分析:
class是一種特殊的struct
- 在內(nèi)存中class依舊可以看做是變量的集合
- class與struct遵循相通的對(duì)齊準(zhǔn)則
- class中的成員函數(shù)與成員變量是分開(kāi)存放的
*每個(gè)對(duì)象有獨(dú)立的成員變量
*所有對(duì)象共享類中的成員函數(shù)
下圖中的結(jié)果是什么?
上面的結(jié)果需要分情況討論,但是不管結(jié)果是多少,它們兩個(gè)都是相等的,因?yàn)閏lass本身就是一種特殊的struct。
下面來(lái)總結(jié)一下,結(jié)構(gòu)體的字節(jié)對(duì)齊,以及它在不同編譯器中的不同的對(duì)齊方式!
Linux系統(tǒng)下:GCC默認(rèn)為4字節(jié)對(duì)齊,有多個(gè)低字節(jié)類型的變量(這多個(gè)低字節(jié)類型(低于字節(jié)對(duì)齊的大小)的變量是連續(xù)存儲(chǔ)的,中間沒(méi)有其他高于4字節(jié)類型變量),則這多個(gè)低字節(jié)類型的變量組成后的字節(jié)總數(shù),再與4字節(jié)對(duì)齊(即4的倍數(shù))
windows下的VS編譯器:以最高字節(jié)類型的字節(jié)數(shù)對(duì)齊,同理有多個(gè)低字節(jié)類型的變量的話(這多個(gè)低字節(jié)類型的變量(低于對(duì)齊字節(jié)的大小)是連續(xù)存儲(chǔ)的,中間沒(méi)有其他類型變量),加在一起再與最大類型字節(jié)數(shù)做對(duì)比(即最大字節(jié)數(shù)的倍數(shù))
注:
如果是這種情況下:
則char s 與int a 合并后的字節(jié)總署為5<8,所以char s與int a 合并后再與8字節(jié)對(duì)齊,所以該結(jié)構(gòu)體的字節(jié)數(shù)為16,而不是24;
下面看一個(gè)例子:
運(yùn)行結(jié)果如下:
注意:以上是在linux上用gcc編譯器進(jìn)行編譯,所以結(jié)構(gòu)體的對(duì)齊方式是以4字節(jié)的對(duì)齊的,所以結(jié)果為20字節(jié),如果放到vs上編譯,那么該結(jié)構(gòu)體的大小就為24字節(jié)。
同時(shí),我們可以看出,我們可以通過(guò)將結(jié)構(gòu)體指針指向類對(duì)象來(lái)直接操作對(duì)象,這也說(shuō)明了,class是一種特殊的結(jié)構(gòu)體!!!
結(jié)論:
運(yùn)行時(shí)的對(duì)象,退化為結(jié)構(gòu)體的形式:
下面再看一個(gè)例子,來(lái)探討C++中對(duì)象的本質(zhì):
以下C程序是用來(lái)模擬C++中的對(duì)象模型的:
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程序,實(shí)現(xiàn)了C++對(duì)象的概念,等價(jià)于下面的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; }總結(jié):
想獲得各種學(xué)習(xí)資源以及交流學(xué)習(xí)的加我:
qq:1126137994
微信:liu1126137994
可以共同交流關(guān)于嵌入式Linux,操作系統(tǒng),C++語(yǔ)言,C語(yǔ)言,數(shù)據(jù)結(jié)構(gòu)與算法等技術(shù)問(wèn)題。
總結(jié)
以上是生活随笔為你收集整理的【C++深度剖析教程28】C++对象模型分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Web页面引入思源黑体
- 下一篇: 【C++深度剖析教程32】new/mal