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

LocalObject::foo1
GlobalObject::foo1
LocalObject::foo2
GlobalObject::foo2
main end
LocalObject::~LocalObject
GlobalObject::~GlobalObject




[Download]

static_test(2013.11.21).zip