2016-06-22 6 views
1

Setzt der Visual Studio 2015-Compiler die doppelte Überprüfung ein?Double-checked locking und das Singleton-Muster

Ich möchte mein Singleton (GOF) Muster Gewinde sicher (lock-free) machen.

Singleton& Singleton::getInstance() { 
    static Singleton instance; 
    return instance; 
} 

Ist es möglich, den Assemblercode zu erstellen und zu überprüfen?

Antwort

2

Sie können auf Disassembly in Debug-> Windows-> Disassembly zugreifen.

Für Klasse:

class S 
{ 
public: 
    static S& getInstance() 
    { 
     static S instance; 
     return instance; 
    } 
}; 

Sie Demontage erhalten:

47: 
48: class S 
49: { 
50: public: 
51:  static S& getInstance() 
52:  { 
push  ebp 
mov   ebp,esp 
sub   esp,0C0h 
push  ebx 
push  esi 
push  edi 
lea   edi,[ebp-0C0h] 
mov   ecx,30h 
mov   eax,0CCCCCCCCh 
rep stos dword ptr es:[edi] 
53:   static S instance; 
54:   return instance; 
mov   eax,offset instance (0D9471h) 
55:  } 
pop   edi 
pop   esi 
pop   ebx 
mov   esp,ebp 
pop   ebp 
ret 
+0

Heißt das, dass die statische Initialisierer über eine Schreibfreigabe bewacht wird? – Damian

+1

Ich habe ein bisschen gegoogelt und gefunden [this] (http://anotherlayer.net/2012/05/04/static-initialization-and-thread-safety/). Statisch sollte threadsicher ab C++ 11 sein – MaciekGrynda