質問

関数について読みながら 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);
}

上記のコードはマルチプロセッサシステムで適切に機能しますか、またはこれにもっと注意する必要がありますか?

役に立ちましたか?

解決

それはコンパイラの設定に依存します。ただし、デフォルトでは、8バイト以下はすべて自然な境界に配置されます。したがって、「int」 32ビット境界で整列されます。

また、" #pragma pack"ディレクティブを使用して、コンパイル単位内のアライメントを変更できます。

答えはMicrosoft C / C ++コンパイラを想定していることを付け加えたいと思います。パッキング規則はコンパイラーごとに異なる場合があります。しかし、一般的に、Windows用のほとんどのC / C ++コンパイラは、Microsoft SDKヘッダーの操作を少しだけ簡単にするために、同じパッキングのデフォルトを使用することを仮定します

他のヒント

コードは正常に見えます(特にそれを壊すために何かをしない限り、変数は適切に配置されます-通常、キャストまたは「パックされた」構造を含みます)。

はい、これで問題ありません。コンパイラは通常、特に指示がない限り整列します。

厳密に言えば、それは実際にAの使用方法に依存します。たとえば、「A」シェルITEMIDLIST内のオブジェクト、または不良な「プラグマパック」を持つ構造体データが適切に整列されていない可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top