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