InterlockedIncrement utilisation
Lors de la lecture sur la fonction InterlockedIncrement j'ai vu la remarque que la variable transmise doit être alignée sur une frontière de 32 bits. Normalement, je l'ai vu le code qui utilise la InterlockedIncrement comme ceci:
class A
{
public:
A();
void f();
private:
volatile long m_count;
};
A::A() : m_count(0)
{
}
void A::f()
{
::InterlockedIncrement(&m_count);
}
Le code ci-dessus fonctionne correctement dans les systèmes multi-processeurs ou dois-je prendre un peu plus de soin pour cela?
OriginalL'auteur Naveen | 2009-03-05
Vous devez vous connecter pour publier un commentaire.
Cela dépend de vos paramètres de compilateur. Toutefois, par défaut, rien huit octets et en vertu sera aligné sur une frontière naturelle. Ainsi, un "int" nous être alignée sur une frontière de 32 bits.
Aussi, le "#pragma pack" directive peut être utilisée pour modifier l'alignement à l'intérieur d'une unité de compilation.
Je voudrais ajouter que la réponse suppose que Microsoft C/C++ compilateur. Règles d'emballage peut différer de compilateur de compilateur. Mais en général, j'aurais assumer que la plupart des compilateurs C/C++ pour Windows, utilisez le même emballage par défaut juste pour rendre l'utilisation du kit de développement Microsoft les en-têtes un peu plus facile.
OriginalL'auteur Torlack
Le code a l'air bien (variables est correctement aligné sauf si vous faites quelque chose pour briser ce - impliquant généralement de moulage ou de 'paniers' structures).
OriginalL'auteur Michael Burr
Oui, cela fonctionne très bien. Les compilateurs généralement faire aligner, sauf indication contraire.
OriginalL'auteur sharptooth
Strictement parlant, cela dépend vraiment de votre utilisation de l'Un - par exemple, si vous mettez Un objet "a" à l'intérieur d'une coquille ITEMIDLIST, ou une structure avec un mauvais "pragma pack" les données peuvent ne pas être correctement alignées.
OriginalL'auteur Nemanja Trifunovic