Total Articles 180
[LocalObject]
class LocalObject { static LocalObject& instance(); }; LocalObject& LocalObject::instance() { static LocalObject localObject; // declared as local // --- (1) --- return localObject; // --- (2) --- }
--- (1) --- mov eax, DWORD PTR [@localObject_initialized] // Loader makes this initial value into 0. test al, 1 // Is localObject initialized? jne SHORT $LN7@instance // If initialized, goto... or eax, 1 // Change it's value into 1. mov DWORD PTR [@localObject_initialized], eax // // calling LocalObject::LocalObject // --- (2) --- $LN7@instance: lea rax, OFFSET FLAT:localObject // return absolute value.
[GlobalObject]
class GlobalObject { static GlobalObject& instance(); }; static GlobalObject globalObject; // declared as global GlobalObject& GlobalObject::instance() { return globalObject; // --- (3) --- }
--- (3) --- lea rax, OFFSET FLAT:globalObject // return absolute value.
[Test]
#include <iostream> using namespace std; #include "localobject.h" #include "globalobject.h" void test1() { LocalObject::instance().foo1(); GlobalObject::instance().foo1(); } void test2() { LocalObject::instance().foo2(); GlobalObject::instance().foo2(); } int main() { cout << "main beg\n"; test1(); test2(); cout << "main end\n"; }
[Result]
GlobalObject::GlobalObject // initialized before main
main beg
LocalObject::LocalObject // initialized in the middle of main when it is accessed for the first time in the codeLocalObject::foo1
GlobalObject::foo1
LocalObject::foo2
GlobalObject::foo2
main end
LocalObject::~LocalObject
GlobalObject::~GlobalObject
[Download]