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);
}
上記のコードはマルチプロセッサシステムで適切に機能しますか、またはこれにもっと注意する必要がありますか?
解決
それはコンパイラの設定に依存します。ただし、デフォルトでは、8バイト以下はすべて自然な境界に配置されます。したがって、「int」 32ビット境界で整列されます。
また、" #pragma pack"ディレクティブを使用して、コンパイル単位内のアライメントを変更できます。
答えはMicrosoft C / C ++コンパイラを想定していることを付け加えたいと思います。パッキング規則はコンパイラーごとに異なる場合があります。しかし、一般的に、Windows用のほとんどのC / C ++コンパイラは、Microsoft SDKヘッダーの操作を少しだけ簡単にするために、同じパッキングのデフォルトを使用することを仮定します。
他のヒント
コードは正常に見えます(特にそれを壊すために何かをしない限り、変数は適切に配置されます-通常、キャストまたは「パックされた」構造を含みます)。
はい、これで問題ありません。コンパイラは通常、特に指示がない限り整列します。
厳密に言えば、それは実際にAの使用方法に依存します。たとえば、「A」シェルITEMIDLIST内のオブジェクト、または不良な「プラグマパック」を持つ構造体データが適切に整列されていない可能性があります。
所属していません StackOverflow