문제

기능에 대해 읽는 동안 인터 로크 시멘트 전달 된 변수가 32 비트 경계에 정렬되어야한다는 말을 보았습니다. 일반적으로 나는 다음과 같은 인터 로크 시드 크레멘트를 사용하는 코드를 보았습니다.

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 헤더 작업을 조금 더 쉽게 작업하기 위해 동일한 포장 기본값을 사용합니다.

다른 팁

코드는 괜찮아 보입니다 (일반적으로 캐스팅 또는 '포장 된'구조와 관련된 작업을 수행하기 위해 구체적으로 무언가를하지 않는 한 변수는 제대로 정렬됩니다).

예, 이것은 잘 작동합니다. 컴파일러는 일반적으로 달리 지시하지 않는 한 정렬됩니다.

엄밀히 말하면, 그것은 실제로 당신의 사용에 달려 있습니다 - 예를 들어, 쉘 itemidlist 내에 "a"객체를 포장하거나 나쁜 "Pragma pack"이있는 구조물이 데이터를 제대로 정렬하지 않을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top