모든 함수가 오류가없는 경우 0이고 오류 값이 0이 아닌 오류 코드를 반환하는 API를 가정합니다.C 정적 인라인 매개 변수 평가 최적화
int foo(...);
int bar(...);
이 API 함수하자. 이 있으라 수 foo
및 bar
이 항상 호출해야 순서 및 foo는 바에서 호출 할 필요가있는 코드 조각에 관계없이 이전 오류의하지만 먼저 즉, 0이 아닌 에러 코드가 전파 될
int foobar(...)
{
int rc = 0, rc_;
/* ... */
rc_ = foo(...); rc = rc ? rc : rc_;
rc_ = bar(...); rc = rc ? rc : rc_;
return rc;
}
rc를 쓰면 rc_ multiplexing은 지루하고 오류가 발생하기 쉽습니다 (세 번째 연산자 인 if/else 또는 다른 것이 사용 되더라도 상관 없습니다).
수있다 에러 전파 도우미 함수
이이int foobar(...)
{
int rc = 0;
/* ... */
rc = rc_propagate(foo(...), rc);
rc = rc_propagate(bar(...), rc);
return rc;
}
같이 foobar
에서 사용될 수
static inline
int rc_propagate(int r, int p){ return p ? p : r; }
C 표준의 제 파라미터의 평가를 당김으로써 최적화 할 수 있는가하자 rc_propagate
, 정적 인라인 함수를 세 번째로 입력하여 두 번째 매개 변수 이 0이 아닌 경우 삼항 연산자 평가 규칙으로 인해 실행되지 않을 수 있습니다.
하지만, 사람이 인용을 위해 기다릴 것 표준의 관련 부분. – immibis
@ 2501 :이 경우에는 외부 기능이 아니고 정적 인라인입니다.내 의심은 전적으로 정적 인라인에 관한 것입니다. 특히 LLVM 개발자의 몇 가지 블로그 항목과 정적 인라인 함수 호출과 관련된 가능한 최적화를 읽었습니다. – datenwolf
참고로,'rc = rc? rc : foo (...);'문제를 모두 피할 수 있습니까? – 2501