2009-11-07 2 views
2

열거 형 값이 OR 연산되면 명시 적 형변환없이 오류가 발생하므로 C++에서 비트 플래그를 저장하는 데 열거 형을 사용하는 것은 약간 번거로운 작업입니다.C++에서 비트 플래그 열거 형

FlagsSet operator|(FlagsSet a, FlagsSet b) 
{ 
    return FlagsSet(int(a) | int(b)); 
} 

나는이 방법은 어떤 런타임 의미를 가지고 있는지 알고 싶습니다

this question에 대한 허용 대답은 | 연산자를 오버로딩 제안?

+0

+1 나는이 기술을 아직 모르기 때문에. – StackedCrooked

답변

5

정확성 측면에서 런타임에 미치는 영향? 아니요, 이것은 정확히 당신이 원하는 것이어야합니다.

속도 측면에서 런타임과 관련이 있습니까? 나는 괜찮은 컴파일러가 릴리스 빌드에 대한 지침의 최소 수에 맞게이를 최적화하는 것을 기대합니다 (단, inline을 추가하는 것이 좋습니다).

+2

+1. '인라인 (inline) '에 대해서 : 스마트 컴파일러는 키워드와 인라인 코드를 재량에 따라 무시할 것이다. 일반적으로 성능상의 이유로 인라인 기능을 표시하는 것은 일반적으로 쓸모가 없습니다. 그러나 함수가 헤더 파일에 정의되어 있다고 가정 할 때'inline '을 추가하는 다른 이유가 있습니다. – avakar

0

잠재적으로 RVO, 레지스터 및/또는 인라인 최적화를 제외하고 세 개의 복사본과 함수 호출을 수행합니다.

누적 비트 OR 연산 자체는 일반적으로 단일 프로세서 명령어로 분해됩니다.

+0

병목 현상이 아닐뿐만 아니라, 컴파일러가 이런 것들을 최적화 할만큼 똑똑 할 수 있음을 인정합니다. – rlbond

0

코드가 정확합니다.

코드는 형식 변환없이와 같은 속도입니다.

그러나 'FlagSet'형식은 조건 테스트 ("> (if (Flag)")의 컨텍스트에서 사용되므로 속도가 더 빠르지 만 코드가 빠르다는 것은 관련성이 없습니다. 레지스터 크기의 두 값 중 현명한 '또는'보다 더 큽니다.

1

비트 플래그에 std :: bitset ... 훨씬 더 간단합니다.) 또는 boost :: dynamic_bitset.