문제

반환 유형은 오류가 자주 확인됩니다. 그러나 계속 실행될 코드는 다른 방식으로 지정 될 수 있습니다.

if(!ret)
{
   doNoErrorCode();
}
exit(1);

또는

if(ret)
{
   exit(1);
}
doNoErrorCode();

한 가지 방법 헤비급 CPU는 간단한 통계를 사용하여 가까운 근접/지역에서 찍은 가지에 대해 추측 할 수 있습니다-나는 0이 알려지지 않은 곳에서 분기 추측 (-2, -1,0,+1,+2)을위한 4 비트 메커니즘을 연구했습니다. 진정한 지점으로 간주됩니다.

위의 간단한 기술을 고려할 때 내 질문은 코드를 구성하는 방법에 관한 것입니다. 주요 컴파일러와 주요 아키텍처 사이에 협약이 있어야한다고 가정합니다. 이것들은 나의 두 가지 질문입니다

  1. 코드가 파이프 라인이 채워질 때 부울 값이 바이어스되는 종종 방문 루프가 아닌 경우?
  2. 분기에 대한 추측은 True 또는 False 또는 0에서 시작해야합니다 (파이프 라인은 무언가로 채워져 있어야합니다). 어느 것이 될 것입니까?
도움이 되었습니까?

해결책

동작은 CPU에 따라 다르며 컴파일러는 종종 지침을 다시 작성합니다. 이 매뉴얼에 필요한 모든 정보를 찾을 수 있습니다. http://agner.org/optimize/.

제 생각에는 어떤 일이 일어나는지 알 수있는 유일한 방법은 컴파일러가 생성 한 어셈블리 코드를 읽는 것입니다.

다른 팁

GCC에서 사용할 수 있습니다 __builtin_expect 컴파일러에 분기 예측 정보를 제공합니다. 약간 쉽게하기 위해 Linux 커널에서 예를 들어 사용 된 가능성이 낮은 매크로를 빌릴 수 있습니다.

#define likely(x)       __builtin_expect((x),1)
#define unlikely(x)     __builtin_expect((x),0)

그리고 예를 들어

if (unlikely(!some_function())
    error_handling();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top