9

在阅读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

4 回答 4

15

这取决于您的编译器设置。但是,默认情况下,任何 8 个字节及以下的内容都将在自然边界上对齐。因此,我们在 32 位边界上对齐“int”。

此外,“#pragma pack”指令可用于更改编译单元内的对齐方式。

我想补充一点,答案假定 Microsoft C/C++ 编译器。打包规则可能因编译器而异。但总的来说,我会假设大多数 Windows 的 C/C++ 编译器都使用相同的打包默认值,只是为了更轻松地使用 Microsoft SDK 头文件。

于 2009-03-05T17:13:03.570 回答
0

代码看起来很好(变量将正确对齐,除非您专门做一些事情来打破它 - 通常涉及强制转换或“打包”结构)。

于 2009-03-05T17:13:36.393 回答
0

是的,这可以正常工作。除非另有说明,否则编译器通常会对齐。

于 2009-03-05T17:13:37.373 回答
0

严格来说,这实际上取决于您对 A 的使用 - 例如,如果您在 shell ITEMIDLIST 中打包一个“A”对象,或者一个带有错误“pragma pack”的结构,则数据可能无法正确对齐。

于 2009-03-13T14:43:20.557 回答