이 경우 캐스팅의 성능이 저하 될 것으로 예상됩니까? .배열 인덱싱시 열거 형 클래스 성능
enum class myEnum {A,B,C};
myArray[(int)myEnum::A] = 123;
비교해보십시오.
enum myEnum {A,B,C};
myArray[A] = 123;
형식 안전을 위해 새 스타일 열거 형 클래스를 사용하고 있지만 성능 저하를 원하지는 않습니다.
이 경우 캐스팅의 성능이 저하 될 것으로 예상됩니까? .배열 인덱싱시 열거 형 클래스 성능
enum class myEnum {A,B,C};
myArray[(int)myEnum::A] = 123;
비교해보십시오.
enum myEnum {A,B,C};
myArray[A] = 123;
형식 안전을 위해 새 스타일 열거 형 클래스를 사용하고 있지만 성능 저하를 원하지는 않습니다.
인덱스로 사용되는 enum 값이 컴파일 타임에 알려 지거나 변수로 전달되었는지에 따라 달라집니다.
myArray[(int)myEnum::A]
은 e
의 물리적 표현에 따라 벌금이 부과되지 않지만 myArray[(int)e]
일 수 있습니다 (즉, "확장"해야 할 수도 있음).
반면에 간단한 확장은 성능 문제로 나타날 가능성이없는 사소한 작업입니다 : 분기 예측 (조건부) 및 캐싱과 같은 것들이 대부분의 응용 프로그램에서 훨씬 중요합니다 (하위 수준), 높은 수준의 알고리즘이 중요합니다.
참고 : 런타임 시나리오에서 확장 문제를 방지하기 위해, 당신은 컴파일러 산술 예상되는 자연적인 유형으로 myEnum
의 기본 유형을 정의 할 수 있습니다, 나는 ptrdiff_t
여기에 가장 적합 할 것입니다 생각합니다. 그것은 큰 정수입니다.
아니요. 성능에 영향을 줄 수있는 것은 아닙니다. 이것은 모두 컴파일 타임에 해결됩니다.
필자는 기대하지 않았지만 컴파일러 구현에 따라 달라질 것입니다. 두 가지 접근법을 모두 시도해 보는 것이 어떻습니까? 몇 가지 다른 컴파일러 최적화 설정을 시도해보십시오. 따라서 프로덕션 코드를 컴파일 할 때 다른 점이 나타나지 않을 것입니다.
전체 표현식 (int)myEnum::A
은 컴파일 타임에 평가 될 수 있기 때문에 캐스트에 대한 어셈블리 명령어가 있을지는 의문입니다.
하지만 정말로 알고 싶다면 샘플 프로그램을 만들고 디스 어셈블리를 덤프하고 성능을 측정하여 분석하십시오.
물론 궁극적으로 컴파일러에 달려 있지만 합리적인 컴파일러가 왜이 두 가지 경우에 서로 다른 코드를 생성하는지 알기가 어렵습니다.
저는 이것을 인텔에서 g ++ 4.7.2로 테스트했으며 동일한 어셈블리 코드로 컴파일했습니다.