C/C++/OC 內(nèi)存布局

這幾天看了些關(guān)于內(nèi)存布局的文章,發(fā)帖總結(jié)摘錄下重點(diǎn)。

C語(yǔ)言的內(nèi)存模型
C語(yǔ)言的內(nèi)存模型

程序代碼區(qū)(code area)

存放函數(shù)體的二進(jìn)制代碼

靜態(tài)數(shù)據(jù)區(qū)(data area)

也稱全局?jǐn)?shù)據(jù)區(qū),包含的數(shù)據(jù)類型比較多乱灵,如全局變量纹份、靜態(tài)變量、一般常量状共、字符串常量。其中:

  • 全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的谁帕,初始化的全局變量和靜態(tài)變量在一塊區(qū)域峡继, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。
  • 常量數(shù)據(jù)(一般常量匈挖、字符串常量)存放在另一個(gè)區(qū)域碾牌。

注意:靜態(tài)數(shù)據(jù)區(qū)的內(nèi)存在程序結(jié)束后由操作系統(tǒng)釋放颠猴。

堆區(qū)(heap area)

一般由程序員分配和釋放,若程序員不釋放小染,程序運(yùn)行結(jié)束時(shí)由操作系統(tǒng)回收翘瓮。malloc()、calloc()裤翩、free()等函數(shù)操作的就是這塊內(nèi)存资盅。

注意:這里所說(shuō)的堆區(qū)與數(shù)據(jù)結(jié)構(gòu)中的堆不是一個(gè)概念,堆區(qū)的分配方式倒是類似于鏈表踊赠。

棧區(qū)(stack area)

由系統(tǒng)自動(dòng)分配釋放呵扛,存放函數(shù)的參數(shù)值、局部變量的值等筐带。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧今穿。

命令行參數(shù)區(qū)

存放命令行參數(shù)和環(huán)境變量的值,如通過(guò)main()函數(shù)傳遞的值伦籍。

C語(yǔ)句的個(gè)部分會(huì)出現(xiàn)在哪些段中
可執(zhí)行文件的段在內(nèi)存中如何布局

C語(yǔ)言的內(nèi)存布局相對(duì)簡(jiǎn)單蓝晒,但也是最基本的。在編譯過(guò)程中就已經(jīng)確定了所有函數(shù)的地址(偏移地址)帖鸦。

C語(yǔ)言沒(méi)有對(duì)象的概念芝薇,那么變量的布局非常簡(jiǎn)單,固定作儿。除去全局洛二,靜態(tài)的變量分配在靜態(tài)數(shù)據(jù)區(qū),其它的臨時(shí)變量攻锰,參數(shù)等晾嘶,要么分配在棧區(qū)由系統(tǒng)自動(dòng)管理,要么由malloc()娶吞、calloc()垒迂、free()等函數(shù)由程序員管理分配在堆區(qū)。而變量本身的空間大小寝志,在分配時(shí)是相對(duì)簡(jiǎn)單并可以確定的娇斑。

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

C++語(yǔ)言在C的基礎(chǔ)上添加了面向?qū)ο蟮母拍畈咛恚肓朔庋b材部,繼承,多態(tài)唯竹。而一個(gè)對(duì)象的內(nèi)存布局就相對(duì)于C語(yǔ)言的結(jié)構(gòu)體等在內(nèi)存的布局要復(fù)雜的多乐导。
在C++中,有兩種數(shù)據(jù)成員(class data members):static 和nonstatic,以及三種類成員函數(shù)(class member functions):static浸颓、nonstatic和virtual:

C++數(shù)據(jù)成員及成員函數(shù)類型

現(xiàn)在我們有一個(gè)類Base物臂,它包含了上面這5中類型的數(shù)據(jù)或函數(shù):

class Base
{
    public:
    
    Base(int i) :baseI(i){};
    
    int getI(){ return baseI; }
    
    static void countI(){};
    
    virtual void print(void){ cout << "Base::print()"; }
    
    virtual ~Base(){}
    
    private:
    
    int baseI;
    
    static int baseS;
};
Base類圖
Base內(nèi)存布局

可以看到旺拉,對(duì)一個(gè)C++對(duì)象來(lái)說(shuō),它的內(nèi)存布局僅有虛表指針和非靜態(tài)成員棵磷,而其他的靜態(tài)成員蛾狗,成員函數(shù)(靜態(tài),非靜態(tài))仪媒,虛表等都是布局在類上的沉桌。
當(dāng)然,這是沒(méi)有考慮繼承的情況算吩。繼承情況下會(huì)更復(fù)雜一些留凭。可以參考(http://www.cnblogs.com/QG-whz/p/4909359.html

OC對(duì)象的內(nèi)存布局

OC對(duì)象的內(nèi)存布局相對(duì)于C++更為復(fù)雜一些偎巢,出現(xiàn)了元類的概念:


OC對(duì)象內(nèi)存布局

簡(jiǎn)單來(lái)說(shuō)蔼夜,最左邊的是對(duì)象(Instance),中間的是類(Class)压昼,最右邊的是元類(Meta Class)求冷。屬性(包括父類)都保存在對(duì)象本身的存儲(chǔ)空間內(nèi);本類的實(shí)例方法保存在類中窍霞,本類的類方法保存在元類中遵倦。

那么對(duì)象的內(nèi)存布局如下:isa 指針指向其類,其余空間保存各級(jí)的屬性(ivar)

Paste_Image.png

而類的內(nèi)存布局如下:

struct objc_class
{
    struct objc_class* isa;
    struct objc_class* super_class;
    const char* name;
    long version;
    long info;
    long instance_size;
    struct objc_ivar_list* ivars;
    struct objc_method_list** methodLists;
    struct objc_cache* cache;
    struct objc_protocol_list* protocols;
};

isa 指針指向其元類官撼,super_class指針指向其父類梧躺,此外還包含實(shí)例變量列表、方法列表傲绣、協(xié)議列表掠哥。
這里特別要指出的是實(shí)例變量列表中的實(shí)例變量的定義如下,它包含了變量的名稱秃诵、類型续搀、偏移等,但卻不包括變量的值-----值在對(duì)象而非類中:

struct objc_ivar {
    char *ivar_name  OBJC2_UNAVAILABLE;
    char *ivar_type  OBJC2_UNAVAILABLE;
    int ivar_offset  OBJC2_UNAVAILABLE;
#ifdef __LP64__
    int space        OBJC2_UNAVAILABLE;
#endif
}

參考文章:
C語(yǔ)言的代碼內(nèi)存布局詳解
C語(yǔ)言內(nèi)存模型
圖說(shuō)C++對(duì)象模型:對(duì)象內(nèi)存布局詳解
c++的類的內(nèi)存布局
OC優(yōu)缺點(diǎn)
OC對(duì)象的內(nèi)存布局
Objetive-C內(nèi)存布局

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末菠净,一起剝皮案震驚了整個(gè)濱河市禁舷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌毅往,老刑警劉巖牵咙,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異攀唯,居然都是意外死亡洁桌,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)侯嘀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)另凌,“玉大人谱轨,你說(shuō)我怎么就攤上這事》托唬” “怎么了土童?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)工坊。 經(jīng)常有香客問(wèn)我娜扇,道長(zhǎng),這世上最難降的妖魔是什么栅组? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任雀瓢,我火速辦了婚禮,結(jié)果婚禮上玉掸,老公的妹妹穿的比我還像新娘刃麸。我一直安慰自己,他們只是感情好司浪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布泊业。 她就那樣靜靜地躺著,像睡著了一般啊易。 火紅的嫁衣襯著肌膚如雪吁伺。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,727評(píng)論 1 305
  • 那天租谈,我揣著相機(jī)與錄音篮奄,去河邊找鬼。 笑死割去,一個(gè)胖子當(dāng)著我的面吹牛窟却,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呻逆,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼夸赫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了咖城?” 一聲冷哼從身側(cè)響起茬腿,我...
    開(kāi)封第一講書(shū)人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宜雀,沒(méi)想到半個(gè)月后切平,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡州袒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年揭绑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片郎哭。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡他匪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出夸研,到底是詐尸還是另有隱情邦蜜,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布亥至,位于F島的核電站悼沈,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏姐扮。R本人自食惡果不足惜絮供,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茶敏。 院中可真熱鬧壤靶,春花似錦、人聲如沸惊搏。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)恬惯。三九已至向拆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酪耳,已是汗流浹背浓恳。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碗暗,地道東北人奖蔓。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像讹堤,于是被迫代替她去往敵國(guó)和親吆鹤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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