Total Articles 180
[StaticObject]
[StaticObject.h] class StaticObject { public: static StaticObject& instance(); }; [StaticObject.cpp] StaticObject& StaticObject::instance() { static StaticObject staticObject; // --- (1) --- return staticObject; }
--- (1) ---- 00401421 mov eax,1 00401426 test byte ptr [$S1 (4033D4h)],al // Loader makes this initial value into 0. // Is staticObject initialized ? 0040142C jne StaticObject::instance+63h (401463h) // If initialized, goto... 0040142E or dword ptr [$S1 (4033D4h)],eax // Change it's value into 1. // // initialzie staticObject // return staticObject; 00401463 mov eax,offset staticObject (4033D0h) // return absolute value.
[GlobalObject]
[GlobalObject.h] class GlobalObject { static GlobalObject& instance(); }; [GlobalObject.cpp] GlobalObject globalObject; // declared as global
GlobalObject& GlobalObject::instance() { return globalObject; // --- (2) --- }
--- (2) --- mov eax, OFFSET ?globalObject@@3VGlobalObject@@A ; globalObject // return absolute value.
[static_test.cpp]
#include "StaticObject.h" #include "GlobalObject.h" void test1() { GlobalObject::instance().foo1(); StaticObject::instance().foo1(); } void test2() { GlobalObject::instance().foo2(); StaticObject::instance().foo2(); } #include <iostream> using namespace std; int main() { cout << "main beg\n"; test1(); test2(); cout << "main end\n"; }
[Result]
$ static_test
GlobalObject::GlobalObject // created before main entry.
main beg
GlobalObject::foo1
StaticObject::StaticObject // created when static object is accessed for the first time in execution.
StaticObject::foo1
GlobalObject::foo2
StaticObject::foo2
main end
StaticObject::~StaticObject
GlobalObject::~GlobalObject
[Download]
답글 내용보고 찾아왔습니다.
http://agbird.egloos.com/4730538#12959642.01 에 제가 설명드렸듯이 static 전역 객체와 static 지역 객체는 다르며 말씀하신 늦은 초기화는 static 지역 객체에만 해당합니다.
static 클래스 멤버 변수는 static 전역 객체에 해당합니다.