2009-03-05 17 views
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); 
} 

マルチプロセッサシステムで適切に上記のコードの作業を行うか、私はこのためにいくつかのより多くの世話をする必要がありますか?

答えて

15

コンパイラの設定によって異なります。しかし、デフォルトでは、8バイト以下のものは自然境界に整列されます。したがって、 "int"は32ビット境界で整列されます。

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

答えは、Microsoft C/C++コンパイラを前提としています。パッキング規則は、コンパイラごとに異なる場合があります。しかし、一般的には、私はと仮定します.Windows用のほとんどのC/C++コンパイラは、MicrosoftのSDKヘッダーを使って作業するのにちょうど同じ設定を使用します。

0

コードは正常に見えます(特に、キャストや 'パックされた'構造を含む)。

0

はい、これは正常に動作します。コンパイラは通常、別途指示がない限り整列します。

0

厳密に言えば、それは本当にあなたの使い方にかかっています。例えば、シェルのITEMIDLISTに "A"オブジェクトをパックするか、悪い "プラグマパック"を含む構造体をパックすると、データが正しく整列されません。

関連する問題