Question

Tout en lisant sur la fonction InterlockedIncrement J'ai vu la remarque que la variable passée doit être alignée sur une limite de 32 bits. Normalement, j'ai vu le code qui utilise 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-t-il correctement dans les systèmes multiprocesseurs ou dois-je en prendre plus soin?

Était-ce utile?

La solution

Cela dépend des paramètres de votre compilateur. Cependant, par défaut, huit octets et moins seront alignés sur une limite naturelle. Ainsi, un " int " nous sommes alignés sur une limite de 32 bits.

En outre, le "#pragma pack" La 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 le compilateur Microsoft C / C ++. Les règles d'emballage peuvent différer d'un compilateur à l'autre. Mais en général, je supposerais que la plupart des compilateurs C / C ++ pour Windows utilisent les mêmes valeurs par défaut de compression, ce qui facilite légèrement le travail avec les en-têtes Microsoft SDK.

Autres conseils

Le code est correct (les variables seront correctement alignées à moins que vous ne fassiez quelque chose pour y remédier - impliquant généralement des structures moulées ou "compactées").

Oui, cela fonctionnera bien. Les compilateurs s’alignent généralement, sauf indication contraire.

Strictement parlant, cela dépend vraiment de votre utilisation de A - par exemple, si vous faites un "A" " objet dans un shell ITEMIDLIST, ou une structure avec un mauvais "pragma pack" les données peuvent ne pas être correctement alignées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top