Frage

Während über die Funktion InterlockedIncrement ich sah die Bemerkung, dass die Variable übergeben muss auf einer 32-Bit-Grenze ausgerichtet werden. Normalerweise habe ich den Code zu sehen, die die InterlockedIncrement wie folgt verwendet:

class A
{
 public:
   A();
   void f();

 private:
  volatile long m_count;
};

A::A() : m_count(0)
{
}

void A::f()
{
  ::InterlockedIncrement(&m_count);
}

Gibt den obigen Code richtig funktioniert in Multiprozessorsystemen oder sollte ich etwas mehr Sorgfalt dafür nehmen?

War es hilfreich?

Lösung

Es hängt von Ihren Compiler-Einstellungen. Jedoch standardmäßig, alles acht Bytes und unter wird auf einer natürlichen Grenze ausgerichtet werden. So ein "int" wir auf einer 32-Bit-Grenze ausgerichtet werden.

Auch kann die „#pragma pack“ Richtlinie verwendet werden, die Ausrichtung in einer Kompilierung Einheit zu ändern.

Ich möchte hinzufügen, dass die Antwort übernimmt Microsoft C / C ++ Compiler. Verpackungs Regeln könnten von Compiler zu Compiler unterscheiden. Aber im Allgemeinen, würde ich übernehmen , dass die meisten C / C ++ Compiler für Windows verwendet die gleiche Verpackung Standardwert nur mit Microsoft SDK, um die Arbeit headers ein bisschen einfacher.

Andere Tipps

Der Code sieht gut aus (Variablen richtig ausgerichtet werden, wenn Sie speziell etwas zu tun, dass zu brechen - in der Regel beteiligt Gießen oder ‚verpackt‘ Strukturen).

Ja, das funktioniert gut. Compiler in der Regel richtet sofern nichts anderes angegeben.

Genau genommen, es hängt wirklich von Ihrer Nutzung von A -. Zum Beispiel, wenn Sie sich in einer Schale ITEMIDLIST, oder eine Struktur mit einem schlechten „Pragma Pack“ die Daten ein „A“ Objekt packen werden möglicherweise nicht richtig ausgerichtet

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top