Использование InterlockedIncrement

при чтении о функции InterlockedIncrement Я видел замечание, что переданная переменная должна быть выровнена по 32-битной границе. Обычно я видел код, который использует InterlockedIncrement следующим образом:

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

 private:
  volatile long m_count;
};

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

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

правильно ли работает приведенный выше код в многопроцессорных системах или я должен больше заботиться об этом?

4 ответов


Это зависит от настроек компилятора. Однако по умолчанию все восемь байтов и ниже будут выровнены по естественной границе. Таким образом," int " мы выровнены по 32-битной границе.

кроме того, директива "#pragma pack" может использоваться для изменения выравнивания внутри блока компиляции.

Я хотел бы добавить, что ответ предполагает компилятор Microsoft C/C++. Правила упаковки могут отличаться от компилятора к компилятору. Но в общем, я бы предположим что большинство Компиляторы C / C++ для Windows используют одни и те же значения по умолчанию для упрощения работы с заголовками Microsoft SDK.


код выглядит нормально (переменные будут правильно выровнены, если вы специально не сделаете что - то, чтобы сломать это-обычно с использованием литья или "упакованных" структур).


Да, это будет работать нормально. Компиляторы обычно выравнивают, если не указано иное.


строго говоря, это действительно зависит от вашего использования - например, если вы упаковываете объект "A" в ITEMIDLIST оболочки или структуру с плохим "пакетом pragma", данные могут быть неправильно выровнены.