Использование 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", данные могут быть неправильно выровнены.