2016-05-04 14 views
1

Für eine eindeutige ID für ein Objekt kann ich einen Zähler auf zwei Arten erstellen, aber ich weiß nicht welche besser ist, während sie im Code ganz anders sind (obwohl vielleicht nicht im Byte-Code, ich habe keine Ahnung).statische Variable innerhalb der Funktion vs statische Klasse Variable in C++

Die erste Möglichkeit wäre, eine Funktion zu haben, die eine statische Variable verwendet:

Rubrik:

unsigned int GetNextID(); 

cav:

unsigned int GetNextID() 
{ 
    static unsigned id{0}; 
    return id++; 
} 

Die andere Option:

Kopf :

class UniqueIdGenerator 
{ 
public: 
    static unsigned int GetNextID(); 

private: 
    static unsigned int mID; 
} 

cav:

unsigned int UniqueIdGenerator::mID = 1; 

unsigned int UniqueIdGenerator::GetNextID() 
{ 
    return ++mID; 
} 

FYI, ich habe read, dass der ehemalige nicht sicher ist, fädeln, aber ich sehe nicht, warum diese beiden wäre. Wenn überhaupt, mag ich die einfache Funktion mehr wie es einfacher ist & kürzer.

+4

FWIW, du hast Recht. Keine der beiden Implementierungen ist Thread-sicher. –

+0

Nur um es klarer zu machen, weil sich die Leute aus irgendeinem Grund auf Thread-Sicherheit konzentrieren (es tut mir leid, wenn meine Frage vage ist): Ich frage, warum eine der beiden Methoden besser wäre. Wenn sie genauso Thread-unsicher sind, sollte Thread-Sicherheit nicht in die Diskussion eingehen. – ikku100

Antwort

1

Der Unterschied ist Umfang/Sichtbarkeit der statischen Variablen. Ein Klassenmitglied kann von mehreren Methoden gemeinsam genutzt werden, die Variable in der Methode nicht.

auf dem Prinzip, dass die Daten möglichst privat sein sollte, die statische Variable in der Methode ist sicherer, wenn es Ihren Bedürfnissen entspricht.

Für eine Diskussion der Thread-Sicherheit, wenn die Variable initialisiert, siehe this question., aber die Variable sicher nicht Thread, wenn Sie einige Maßnahmen ergreifen, um sicherzustellen, dass es geschützt ist (entweder Nutzung und Atom (für einen einfachen Wert bevorzugt), oder mit einem Mutex schützen (wenn es mehr als ein Stück von Daten, die geschützt werden sollen))

2

um es Thread-sicher machen Sie std::atomic<unsigned> mID ändern sollte, und schreiben Sie Ihre Funktion als

return mID.fetch_add(1); 

Welche Version Sie wählen, sollte keine Rolle spielen, a Meiner Meinung nach wäre die freie Funktion jedoch diejenige, die ich bevorzuge, da es nicht möglich ist, auf die Variable außerhalb der Funktion zuzugreifen.

Verwandte Themen