2012-12-20 3 views
3

이 경우 캐스팅의 성능이 저하 될 것으로 예상됩니까? .배열 인덱싱시 열거 형 클래스 성능

enum class myEnum {A,B,C}; 
myArray[(int)myEnum::A] = 123; 

비교해보십시오.

enum myEnum {A,B,C}; 
myArray[A] = 123; 

형식 안전을 위해 새 스타일 열거 형 클래스를 사용하고 있지만 성능 저하를 원하지는 않습니다.

답변

6

인덱스로 사용되는 enum 값이 컴파일 타임에 알려 지거나 변수로 전달되었는지에 따라 달라집니다.

myArray[(int)myEnum::A]e의 물리적 표현에 따라 벌금이 부과되지 않지만 myArray[(int)e] 일 수 있습니다 (즉, "확장"해야 할 수도 있음).

반면에 간단한 확장은 성능 문제로 나타날 가능성이없는 사소한 작업입니다 : 분기 예측 (조건부) 및 캐싱과 같은 것들이 대부분의 응용 프로그램에서 훨씬 중요합니다 (하위 수준), 높은 수준의 알고리즘이 중요합니다.

참고 : 런타임 시나리오에서 확장 문제를 방지하기 위해, 당신은 컴파일러 산술 예상되는 자연적인 유형으로 myEnum의 기본 유형을 정의 할 수 있습니다, 나는 ptrdiff_t 여기에 가장 적합 할 것입니다 생각합니다. 그것은 큰 정수입니다.

1

아니요. 성능에 영향을 줄 수있는 것은 아닙니다. 이것은 모두 컴파일 타임에 해결됩니다.

2

필자는 기대하지 않았지만 컴파일러 구현에 따라 달라질 것입니다. 두 가지 접근법을 모두 시도해 보는 것이 어떻습니까? 몇 가지 다른 컴파일러 최적화 설정을 시도해보십시오. 따라서 프로덕션 코드를 컴파일 할 때 다른 점이 나타나지 않을 것입니다.

1

전체 표현식 (int)myEnum::A은 컴파일 타임에 평가 될 수 있기 때문에 캐스트에 대한 어셈블리 명령어가 있을지는 의문입니다.

하지만 정말로 알고 싶다면 샘플 프로그램을 만들고 디스 어셈블리를 덤프하고 성능을 측정하여 분석하십시오.

2

물론 궁극적으로 컴파일러에 달려 있지만 합리적인 컴파일러가 왜이 두 가지 경우에 서로 다른 코드를 생성하는지 알기가 어렵습니다.

저는 이것을 인텔에서 g ++ 4.7.2로 테스트했으며 동일한 어셈블리 코드로 컴파일했습니다.