在阅读函数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);
}
上述代码在多处理器系统中是否正常工作,还是应该更加关注?
答案 0 :(得分:15)
这取决于您的编译器设置。但是,默认情况下,任何八个字节及以下的内容都将在自然边界上对齐。因此,“int”我们将在32位边界上对齐。
此外,“#pragma pack”指令可用于更改编译单元内的对齐。
我想补充一点,答案假设是Microsoft C / C ++编译器。打包规则可能因编译器而异。但总的来说,我会假设大多数Windows的C / C ++编译器使用相同的打包默认值,只是为了更轻松地使用Microsoft SDK标题。
答案 1 :(得分:0)
代码看起来很好(变量将正确对齐,除非你专门做一些事情来打破它 - 通常涉及强制转换或'压缩'结构)。
答案 2 :(得分:0)
是的,这样可以正常使用。除非另有说明,否则编译器通常会对齐。
答案 3 :(得分:0)
严格来说,它实际上取决于您对A的使用 - 例如,如果您在shell ITEMIDLIST中打包“A”对象,或者打包带有错误“pragma pack”的结构,则数据可能无法正确对齐。 / p>