InterlockedIncrement Nutzung
Beim Lesen über die Funktion InterlockedIncrement sah ich die Bemerkung, dass die übergebene variable muss angepasst werden, auf einem 32-bit-Grenze. Normalerweise habe ich den code gesehen nutzt die InterlockedIncrement wie diese:
class A
{
public:
A();
void f();
private:
volatile long m_count;
};
A::A() : m_count(0)
{
}
void A::f()
{
::InterlockedIncrement(&m_count);
}
Nicht den oben genannten code ordnungsgemäß in multi-Prozessor-Systemen oder sollte ich noch mehr für diese Pflege?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es hängt von Ihrem compiler-Einstellungen. Aber, standardmäßig, alles, was mit acht bytes und unter einander abgestimmt werden auf eine Natürliche Grenze. So ein "int", die wir ausgerichtet werden auf einem 32-bit-Grenze.
Auch das "#pragma pack" - Richtlinie verwendet werden können, ändern Sie die Ausrichtung innerhalb einer compile unit.
Möchte ich hinzufügen, dass die Antwort davon ausgegangen, Microsoft C/C++ - compiler. Verpackung Regeln könnten sich von compiler zu compiler. Aber im Allgemeinen, würde ich übernehmen, dass die meisten C/C++ Compiler für Windows der gleichen Verpackung Standardwerte nur um die Arbeit mit Microsoft-SDK-Header ein bisschen einfacher.
Der code sieht gut aus (- Variablen werden korrekt ausgerichtet, sofern Sie nicht explizit etwas tun, um zu brechen, die - in der Regel mit casting oder 'gepackte' Strukturen).
Ja, das wird funktionieren. Compiler in der Regel tun ausrichten, es sei denn, eine andere Anweisung.
Streng genommen, es hängt wirklich von Ihrer Nutzung Ein - zum Beispiel, wenn Sie packen Ein "a" Objekt innerhalb einer shell ITEMIDLIST, oder eine Struktur mit einer schlechten "pragma pack" werden die Daten möglicherweise nicht ordnungsgemäß ausgerichtet werden.