探索C++對象存儲空間

1)全局對象,全局靜態(tài)對象何時創(chuàng)建/析構(gòu)?

2016-11-17 21-31-50屏幕截圖.png

全局對象在main函數(shù)調(diào)用之前被構(gòu)造 全局對象存儲在.data節(jié) (本例是0x804a03c)


2016-11-17 22-34-01屏幕截圖.png

觀察全局對象的析構(gòu)時機(jī),析構(gòu)同樣需要傳遞this指針


2016-11-17 2屏幕截圖.png

可以看到this指針的傳遞過程


2016-11-17 3屏幕截圖.png

可以看到構(gòu)造函數(shù)中,成員變量賦值的過程(***在這里不能看出是否使用了初始化列表***) 0x8(%ebp)拿出this指針,0xc(%ebp), 0x10(%ebp), 0x14(%ebp)分別拿出實參1,2,3

2)類中的靜態(tài)成員變量是否占用對象的存儲空間?

2016-11-17 4.png

對象中的靜態(tài)成員變量和非靜態(tài)成員變量存儲在不同的位置上!

3)類的靜態(tài)成員方法是否傳遞了this指針?

2016-11-17 5.png

由于沒有傳遞this指針,導(dǎo)致類的靜態(tài)成員方法無法修改類的非靜態(tài)成員變量,此時編譯報錯 error: invalid use of member ‘Foo::length_’ in static member function 即使寫了foo.doit,也不會傳遞foo首地址(就是this指針)


2016-11-17 6.png

this指針是編譯器維護(hù)的一根指針,程序員也可以顯式使用之
this指針在不同的對象和同一份代碼之間架設(shè)了一座橋梁

4)函數(shù)中定義的靜態(tài)局部對象分析

void doit() { static Foo foo(1,2,3); printf("doit\n"); }
比較帶不帶編譯器選項的區(qū)別 -fno-threadsafe-statics

2016-11-17 22-55-50屏幕截圖.png
2016-11-17 22-57-04屏幕截圖.png

http://lists.apple.com/archives/darwin-drivers/2005/May/msg00066.html
http://wiki.osdev.org/C++
https://opensource.apple.com/source/libcppabi/libcppabi-14/src/cxa_guard.cxx.auto.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 重新系統(tǒng)學(xué)習(xí)下C++;但是還是少了好多知識點;socket;unix;stl;boost等; C++ 教程 | 菜...
    kakukeme閱讀 20,456評論 0 50
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,676評論 1 51
  • const 引用 const 引用是指向 const 對象的引用:const int ival = 1024;co...
    rogerwu1228閱讀 741評論 0 1
  • 第一天 一.內(nèi)聯(lián)函數(shù)(inline) 函數(shù)調(diào)用的時候需要建立棧內(nèi)存環(huán)境,進(jìn)行參數(shù)傳遞,并產(chǎn)生程序執(zhí)行轉(zhuǎn)移,這些工作...
    陳果123閱讀 1,221評論 0 1
  • 站在巨人的肩膀上——IDA PRO權(quán)威指南閱讀筆記 一,窗口 view->open subviews 打開/關(guān)閉各...
    SueLyon閱讀 14,781評論 0 6

友情鏈接更多精彩內(nèi)容