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