[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]

static_test.zip