1)全局對(duì)象,全局靜態(tài)對(duì)象何時(shí)創(chuàng)建/析構(gòu)?
全局對(duì)象在main函數(shù)調(diào)用之前被構(gòu)造 全局對(duì)象存儲(chǔ)在.data節(jié) (本例是0x804a03c)
觀察全局對(duì)象的析構(gòu)時(shí)機(jī),析構(gòu)同樣需要傳遞this指針
可以看到this指針的傳遞過(guò)程
可以看到構(gòu)造函數(shù)中媒咳,成員變量賦值的過(guò)程(***在這里不能看出是否使用了初始化列表***) 0x8(%ebp)拿出this指針,0xc(%ebp), 0x10(%ebp), 0x14(%ebp)分別拿出實(shí)參1货岭,2锄俄,3
2)類(lèi)中的靜態(tài)成員變量是否占用對(duì)象的存儲(chǔ)空間?
對(duì)象中的靜態(tài)成員變量和非靜態(tài)成員變量存儲(chǔ)在不同的位置上浇坐!
3)類(lèi)的靜態(tài)成員方法是否傳遞了this指針窿凤?
由于沒(méi)有傳遞this指針仅偎,導(dǎo)致類(lèi)的靜態(tài)成員方法無(wú)法修改類(lèi)的非靜態(tài)成員變量,此時(shí)編譯報(bào)錯(cuò) error: invalid use of member ‘Foo::length_’ in static member function 即使寫(xiě)了foo.doit,也不會(huì)傳遞foo首地址(就是this指針)
this指針是編譯器維護(hù)的一根指針雳殊,程序員也可以顯式使用之
this指針在不同的對(duì)象和同一份代碼之間架設(shè)了一座橋梁
4)函數(shù)中定義的靜態(tài)局部對(duì)象分析
void doit() { static Foo foo(1,2,3); printf("doit\n"); }
比較帶不帶編譯器選項(xiàng)的區(qū)別 -fno-threadsafe-statics
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