문제

GCC 컴파일러는 __builtin_expect 문을 지원하여 가능성이 높고 매크로를 정의하는 데 사용됩니다.

예를 들어.

#define likely(expr)    (__builtin_expect(!!(expr), 1))
#define unlikely(expr)  (__builtin_expect(!!(expr), 0))

Microsoft Visual C 컴파일러에 동등한 명령문이 있습니까?

도움이 되었습니까?

해결책

난 그냥 펀트라고 말합니다

그런 것은 없습니다. 거기 있습니다 __추정하다(), 그러나 사용하지 마십시오. 다른 종류의 Optimizer 지시문입니다.

실제로 GNU 내장이 매크로로 싸인 이유는 자동으로 제거 할 수 있기 때문입니다. __GNUC__ 정의되지 않았습니다. 그 매크로에 대해서는 가장 필요한 것이 없으며 실행 시간 차이를 눈치 채지 못할 것이라고 확신합니다.

요약

그냥 제거 (null out) *likely 비 GNU에서. 당신은 그것을 놓치지 않을 것입니다.

다른 팁

에 따르면 http://www.akkadia.org/drepper/cpumemory.pdf CPU가 동적으로 올바르게 예측하더라도 정적 분기 예측을 사용하는 것이 여전히 의미가 있습니다. 그 이유는 정적 예측이 올바르게 수행되면 L1I 캐시가 훨씬 더 효율적으로 사용되기 때문입니다.

C ++ 20 표준에는 포함됩니다 [[likely]] 그리고 [[unlikely]] 분기 예측 속성.

속성 제안의 최신 개정은 http://wg21.link/p0479

원래 속성 제안은 찾을 수 있습니다 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0479r0.html

프로그래머는 PGO를 선호해야합니다. 속성은 잘못 적용되면 성능을 쉽게 줄일 수 있거나 프로그램이 변경 될 때 나중에 부정확해질 수 있습니다.

__추정하다 비슷해야합니다.

그러나이 작업을 잘하려면 사용해야합니다. 프로필 가이드 최적화 정적 힌트보다는.

에 따르면 오해를 방지하기위한 분기 및 루프 재구성 인텔의 문서 :

이 규칙을 활용하기 위해 코드를 효과적으로 작성하려면 IF-ELSE 또는 스위치 명령문을 작성할 때 가장 일반적인 사례를 먼저 확인하고 점차적으로 가장 일반적인 작업으로 작업하십시오.

불행히도 당신은 같은 것을 쓸 수 없습니다

#define if_unlikely(cond) if (!(cond)); else 

VS10의 MSVC Optimizer는 이러한 "힌트"를 무시하기 때문입니다.

코드에서 먼저 오류를 처리하는 것을 선호하기 때문에 덜 효율적인 코드를 작성하는 것 같습니다. 다행히도 두 번째 CPU는 지점을 만나서 정적 힌트 대신 통계를 사용합니다.

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