1

반환 형식은 오류가 있는지 자주 확인됩니다. 그러나 실행을 계속할 코드는 다른 방법으로 지정할 수 있습니다. 헤비급 CPU의 간단한 통계를 사용하여 주변의 근접/지역에서 촬영 한 가지 추측 할 수실행 파이프 라인 유지

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

또는

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

한 가지 방법은 - 나는 -2, -1 지점 투기 (위해 4 비트 메커니즘을 연구 , 0, + 1, + 2) 여기서 0은 알 수 없으며 2는 참 분기로 간주됩니다.

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

  1. 코드가 파이프 라인 채워질 때 부울 값이 편향된 자주 방문하는 루프가 아닌 경우?
  2. 분기에 대한 추측은 true 또는 false 또는 0으로 시작해야합니다 (파이프 라인은 무언가로 채워 져야합니다). 어느 쪽이 될 가능성이 높습니까?

답변

2

동작은 CPU에 따라 다르며 컴파일러는 종종 명령을 다시 정렬합니다. 이 설명서에서 필요한 모든 정보를 찾을 수 있습니다 : http://agner.org/optimize/.

제 생각에는 컴파일러에서 생성 된 어셈블리 코드를 읽는 것이 무엇인지 알 수있는 유일한 방법입니다.

+0

감사합니다. –

+0

놀라운 내용, 많은 <3 –

2

gcc에서 __builtin_expect을 사용하여 분기 예측 정보를 컴파일러에 제공 할 수 있습니다. 약간 더 쉽게 만들려면 예를 들어 사용 된 가능성이 높거나 거의 없을 매크로를 빌릴 수 있습니다. Linux 커널의 경우 :

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

다음에 예를 들어.

if (unlikely(!some_function()) 
    error_handling(); 
+0

좋은 정보, 감사합니다. –