50_C++對(duì)象模型分析(上)

0. 回歸本質(zhì)

class是一種特殊的struct蕉毯,class的默認(rèn)訪問(wèn)權(quán)限是private第煮,struct的默認(rèn)訪問(wèn)權(quán)限是public健爬。

  • 在內(nèi)存中class依舊可以看作是變量的集合
  • classstruct遵循相同的內(nèi)存對(duì)齊規(guī)則
  • class中的成員函數(shù)成員變量是分開(kāi)存放的佩耳, 成員變量存放在棧砂竖、堆或者常量區(qū)中真椿, 成員函數(shù)存放在代碼段

每個(gè)對(duì)象有獨(dú)立的成員變量乎澄,所有的對(duì)象共享類(lèi)中的成員函數(shù)突硝。

編程說(shuō)明:對(duì)象內(nèi)存布局初探

#include <iostream>
#include <string>

using namespace std;

class A
{
    int i;
    int j;
    char c;
    double d;
public:
    void print()
    {
        cout << "i = " << i << ", "
            << "j = " << j << ", "
            << "c = " << c << ", "
            << "d = " << d << endl;
    }
};

struct B
{
    int i;
    int j;
    char c;
    double d;
};


int main()
{
    A a;
    
    cout << "sizeof(A) = " << sizeof(A) << endl;
    cout << "sizeof(a) = " << sizeof(a) << endl;
    cout << "sizeof(B) = " << sizeof(B) << endl;        // 內(nèi)存對(duì)齊: 20byte
    
    a.print();
    
    B* p = reinterpret_cast<B*>(&a);
    
    p->i = 1;
    p->j = 2;
    p->c = 'a';
    p->d = 3;
    
    a.print();
    
    B& bp = reinterpret_cast<B&>(a);
    
    bp.i = 10;
    bp.j = 20;
    bp.c = 'b';
    bp.d = 4.3;
    
    a.print();
    
    return 0;
}

輸出結(jié)果:

sizeof(A) = 20
sizeof(a) = 20
sizeof(B) = 20
i = -1219554259, j = -1218018364, c = , d = -8.07148e-42
i = 1, j = 2, c = a, d = 3
i = 10, j = 20, c = b, d = 4.3

1. C++對(duì)象模型分析——成員變量分析

運(yùn)行時(shí)的對(duì)象退化為結(jié)構(gòu)體的形式:
(1) 所有成員變量在內(nèi)存中依次排布
(2) 成員變量間可能存在內(nèi)存間隙(內(nèi)存對(duì)齊)
(3) 可以通過(guò)內(nèi)存地址直接訪問(wèn)成員變量(通過(guò)指針或者引用可以直接修改對(duì)象中成員變量的值)
(4) 訪問(wèn)權(quán)限關(guān)鍵字在運(yùn)行時(shí)失效(訪問(wèn)權(quán)限關(guān)鍵字只在編譯器有效,在運(yùn)行期無(wú)效)

2. C++對(duì)象模型分析——成員函數(shù)分析

  • 類(lèi)中的成員函數(shù)位于代碼段
  • 調(diào)用成員函數(shù)時(shí)對(duì)象地址作為參數(shù)隱式傳遞
  • 成員函數(shù)通過(guò)對(duì)象地址訪問(wèn)成員變量
  • C++語(yǔ)法規(guī)則隱藏了對(duì)象地址的傳遞過(guò)程

3. C語(yǔ)言實(shí)現(xiàn)面向?qū)ο蟆狙a(bǔ)充】

4. 小結(jié)

  • C++中的類(lèi)對(duì)象在內(nèi)存布局上與結(jié)構(gòu)體相同
  • 成員變量成員函數(shù)在內(nèi)存中分開(kāi)存放
  • 訪問(wèn)權(quán)限關(guān)鍵字在運(yùn)行時(shí)失效
  • 調(diào)用成員函數(shù)時(shí)對(duì)象地址作為參數(shù)隱式傳遞
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末置济,一起剝皮案震驚了整個(gè)濱河市解恰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌浙于,老刑警劉巖护盈,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異羞酗,居然都是意外死亡腐宋,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)胸竞,“玉大人欺嗤,你說(shuō)我怎么就攤上這事∥乐Γ” “怎么了煎饼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)校赤。 經(jīng)常有香客問(wèn)我吆玖,道長(zhǎng),這世上最難降的妖魔是什么痒谴? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任衰伯,我火速辦了婚禮,結(jié)果婚禮上积蔚,老公的妹妹穿的比我還像新娘意鲸。我一直安慰自己,他們只是感情好尽爆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布怎顾。 她就那樣靜靜地躺著,像睡著了一般漱贱。 火紅的嫁衣襯著肌膚如雪槐雾。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天幅狮,我揣著相機(jī)與錄音募强,去河邊找鬼。 笑死崇摄,一個(gè)胖子當(dāng)著我的面吹牛擎值,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逐抑,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鸠儿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了厕氨?” 一聲冷哼從身側(cè)響起进每,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎命斧,沒(méi)想到半個(gè)月后田晚,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡国葬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年肉瓦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了遭京。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡泞莉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出船殉,到底是詐尸還是另有隱情鲫趁,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布利虫,位于F島的核電站挨厚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏糠惫。R本人自食惡果不足惜疫剃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望硼讽。 院中可真熱鬧巢价,春花似錦、人聲如沸固阁。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)备燃。三九已至碉克,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間并齐,已是汗流浹背漏麦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留况褪,地道東北人撕贞。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像窝剖,于是被迫代替她去往敵國(guó)和親麻掸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

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

  • 收集非原創(chuàng)文章赐纱,如遇原作者脊奋,請(qǐng)私聊我,我會(huì)表明出處疙描! 1--10 1. C++中什么數(shù)據(jù)分配在棾舷叮或堆,靜態(tài)存儲(chǔ)區(qū)以...
    Juinjonn閱讀 4,939評(píng)論 0 30
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,513評(píng)論 1 51
  • 1. 結(jié)構(gòu)體和共同體的區(qū)別起胰。 定義: 結(jié)構(gòu)體struct:把不同類(lèi)型的數(shù)據(jù)組合成一個(gè)整體久又,自定義類(lèi)型巫延。共同體uni...
    breakfy閱讀 2,118評(píng)論 0 22
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法地消,內(nèi)部類(lèi)的語(yǔ)法炉峰,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法脉执,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,599評(píng)論 18 399
  • 可是疼阔,洛神又怎么會(huì)放過(guò)這種占便宜的機(jī)會(huì)呢“胍模“我要血月玉鐲婆廊。”洛神一開(kāi)口巫橄,神君心肝脾肺腎都疼了淘邻,早知道話不用說(shuō)那么滿...
    卑辰尊月閱讀 263評(píng)論 0 2