2009-03-05 8 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++ 컴파일러로 가정합니다. 패킹 규칙은 컴파일러마다 다를 수 있습니다. 그러나 일반적으로 으로 가정하면 대부분의 C/C++ 컴파일러는 Microsoft의 SDK 헤더를 사용하기 위해 동일한 패키징 기본값을 사용합니다.

0

코드가 잘 보입니다 (특히 캐스팅 또는 '패킹'구조와 관련된 부분을 해치지 않으면 변수가 올바르게 정렬됩니다.).

0

예, 정상적으로 작동합니다. 컴파일러는 일반적으로 달리 지시되지 않는 한 정렬을 수행합니다.

0

엄밀히 말하자면, 그것은 A의 사용법에 달려 있습니다. 예를 들어, 쉘 ITEMIDLIST 내에 "A"객체를 포장하거나 잘못된 "pragma pack"이있는 구조체를 사용하면 데이터가 올바르게 정렬되지 않을 수 있습니다.