우리는 이렇게 가고 공통 유틸리티 라이브러리에 오류 신호에 대한 매크로를 가지고 : 내가 parametersListHere
으로 참조 각에서 컴파일러에 의해 채워집니다 상수와 매크로의 쉼표로 구분 된 목록입니다컴파일러가 함수를 인라인할지 여부를 결정하는 데 사용하는 실제 규칙 집합은 무엇입니까?
#define OurMacro(condition) \
if(condition) { \
} else { \
CallExternalFunctionThatWillThrowAnException(parametersListHere); \
} \
매크로 확장.
그 함수 호출은 항상 호출로 해석됩니다. 함수 구현은 컴파일러에 노출되지 않습니다. 이 함수에는 여섯 개의 매개 변수가 있고 디버그 구성에는 모두 의미있는 값을 가지며 릴리스 구성에서는 두 개만 의미있는 값을 갖고 나머지는 동일한 기본값을 전달합니다.
일반적으로 조건이 true로 유지되므로 호출 속도가 얼마나 빠르든지 신경 쓰지 않고 코드 확장에만 신경을 썼습니다. 6 개의 매개 변수로 해당 함수를 호출 할 때는 7 개의 x86 명령어 (6 push
es와 하나의 call
)가 필요하며 함수 서명이 두 개의 매개 변수만으로 변경된 경우에는 그 중 4 개를 피할 수 있습니다.이 작업은 중간 " 게이트 (gate) "함수는 구현 방식이 컴파일러에게 보이지 않는 방식으로 구현됩니다.
내가 그 변화를 주장해야 하는지를 추정해야합니다. 지금까지의 기본 개선점은 매개 변수의 수를 줄이면 각 인보 케이션에 4 개의 명령어가 삭제된다는 것입니다. 즉, 매크로 확장을 둘러싼 코드가 작아지고 컴파일러가 인라인 될 가능성이 높아지고 방출 된 코드를 더욱 최적화 할 수 있습니다.
코드를 실제로 시도하고 다시 컴파일하지 않고 코드를 신중하게 분석하지 않고 어떻게 계산할 수 있습니까? inline
에 대해 읽을 때마다 컴파일러가 함수를 인라인할지 여부를 결정하는 설명이 있습니다.
함수 내부가 인라인 할 때 컴파일러 결정에 어떤 영향을 주는지에 대한 정확한 규칙 집합을 볼 수 있습니까?
'#ifdef NDEBUG'스위치와 함께 2 개의 다른 기능이없는 이유가 무엇입니까? –
@Matthieu M .: 원래 기능은 내가 모르는 코드에서 이미 호출되었을 수 있습니다. 어쨌든 새로운 함수가 있거나 기존 함수의 시그니처를 변경하면 똑같은 결과를 얻을 수 있으므로 어떤 방식으로 선택하든 상관 없습니다. – sharptooth