C++中對(duì)象的內(nèi)存布局(一)

在上篇文章《戳我》中涯捻,簡(jiǎn)單說(shuō)了繼承的三種分類:?jiǎn)卫^承多律、多重繼承酥馍、重復(fù)繼承逗鸣。

一般的如果沒(méi)有虛函數(shù)贞让,那對(duì)象的內(nèi)存布局就如我們看到的一樣乍构,定義了幾個(gè)變量根據(jù)字節(jié)對(duì)齊就能算出其在內(nèi)存中所占字節(jié)大小甜无。但是有了虛函數(shù),就不同了哥遮,因?yàn)橛辛颂摵瘮?shù)就意味著存在虛函數(shù)指針岂丘,那指針我們知道是占四個(gè)字節(jié)(32位)的,所以從本篇文章開(kāi)始來(lái)分析存在虛函數(shù)時(shí)對(duì)象的內(nèi)存布局是怎么樣的眠饮?(版本是Visual Studio2012)

對(duì)于單繼承:


image.png

寫(xiě)出以下代碼:

class Father
{
public:
    Father(int data1):fa(data1){}
    virtual void f(){cout<<"Father::f()"<<" ";}
    virtual void ff(){cout<<"Father::ff()"<<" ";}
    virtual void fff(){cout<<"Father::fff()"<<" ";}
protected:
    int fa;
};
 
class Son:public Father
{
public:
    Son(int data):sa(data),Father(data){}
    virtual void f(){cout<<"Son::f()"<<" ";}
    virtual void ss(){cout<<"Son::ss()"<<" ";}
    virtual void sss(){cout<<"Son::sss()"<<" ";}
protected:
    int sa;
};
class Grandson:public Son
{
public:
    Grandson(int data):ga(data),Son(data){}
    virtual void f(){cout<<"Grandson::f()"<<" ";}
    virtual void ss(){cout<<"Grandson::ss()"<<" ";}
    virtual void ggg(){cout<<"Grandson::ggg()"<<" ";}
protected:
    int ga;
};
typedef void (*Function)(void);//函數(shù)指針
int main()
{
    //main函數(shù)主要進(jìn)行打印
    Grandson *pgs=new Grandson(12);
    Function pFun=NULL;//定義一個(gè)函數(shù)指針
 
    cout<<"[0]   _vfptr"<<endl;
    for(int i=0;i<6;++i)
    {
        pFun=((Function*)(long**)(*(long*)(pgs)))[i];
        cout<<"   "<<"["<<i<<"]"<<" ";
        pFun();
        cout<<((long**)(*(long*)pgs))[i]<<endl;
    }
 
    cout<<"[1] "<<((long*)pgs)[1]<<endl;
    cout<<"[2] "<<((long*)pgs)[2]<<endl;
    cout<<"[3] "<<((long*)pgs)[3]<<endl;
    
    delete pgs;
    return 0;
}
注:
(long*)(pgs):將pgs強(qiáng)轉(zhuǎn)成long*
(*(long*)(pgs)):解引用奥帘,虛函數(shù)表的地址
(long**)(*(long*)(pgs)):虛函數(shù)表的地址強(qiáng)轉(zhuǎn)成二級(jí)指針

查看Grandson類生成對(duì)象的內(nèi)存布局:(點(diǎn)擊【項(xiàng)目】-》【屬性】-》【C/C++】-》【命令行】-》在其它選項(xiàng)處寫(xiě)上

【/d1 reportSingleClassLayoutGrandson】-》點(diǎn)擊【確定】就好了 )

image.png

可以看出:

1、子類繼承了父類的成員變量仪召,成員函數(shù)不占空間寨蹋。

2、有虛函數(shù)時(shí)出現(xiàn)了一個(gè)vfptr指針扔茅,并把該指針?lè)旁诹藘?nèi)存的開(kāi)始處(相對(duì)對(duì)象偏移為0)钥庇。

3、同名的函數(shù)在虛表中被覆蓋咖摹。

4评姨、同時(shí)也看到了有一張?zhí)摫淼拇嬖冢摫碇袕?號(hào)下標(biāo)開(kāi)始就存放的是虛函數(shù)萤晴,有一個(gè)問(wèn)題就是從虛表中也能看出有RTTI信息(&Grandson_meta)和vfptr相對(duì)于類型的偏移信息(0)吐句,但它不在0號(hào)下標(biāo)鎖對(duì)應(yīng)的位置,那它在哪店读?怎么打印出來(lái)嗦枢?看到的寶寶希望能幫我解答。

將上面程序進(jìn)行打印及調(diào)試屯断,可以看到:

image.png

現(xiàn)在文虏,我們來(lái)畫(huà)出單繼承下Grandson類的內(nèi)存布局:

image.png

https://blog.csdn.net/zhuoya_/article/details/80032784

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末侣诺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子氧秘,更是在濱河造成了極大的恐慌年鸳,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丸相,死亡現(xiàn)場(chǎng)離奇詭異搔确,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)灭忠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門膳算,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人弛作,你說(shuō)我怎么就攤上這事涕蜂。” “怎么了映琳?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵机隙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我刊头,道長(zhǎng)黍瞧,這世上最難降的妖魔是什么诸尽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任原杂,我火速辦了婚禮,結(jié)果婚禮上您机,老公的妹妹穿的比我還像新娘穿肄。我一直安慰自己,他們只是感情好际看,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布咸产。 她就那樣靜靜地躺著,像睡著了一般仲闽。 火紅的嫁衣襯著肌膚如雪脑溢。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,590評(píng)論 1 305
  • 那天赖欣,我揣著相機(jī)與錄音屑彻,去河邊找鬼。 笑死顶吮,一個(gè)胖子當(dāng)著我的面吹牛社牲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悴了,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼搏恤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼违寿!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起熟空,我...
    開(kāi)封第一講書(shū)人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤藤巢,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后痛阻,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體菌瘪,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年阱当,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了俏扩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡弊添,死狀恐怖录淡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情油坝,我是刑警寧澤嫉戚,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站澈圈,受9級(jí)特大地震影響彬檀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瞬女,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一窍帝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧诽偷,春花似錦坤学、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至眠冈,卻和暖如春飞苇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜗顽。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工布卡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人诫舅。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓羽利,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親刊懈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子这弧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容