reference:
"명품 C++ Programming" / 황기태
"전문가를 위한 C++" / 마크 그레고리
리턴 주소, 전달 인자를 저장에서 스택 공간을 추가로 확장하는 과정과 CPU 레지스터 값의 변경(함수 호출이 아니라면 단순히 PC값에 +1을 하는 방식으로 진행될 것, I-TLB 미스, 심하면 페이지 폴트가 발생할 수도 있음)으로 인해 오버헤드가 발생한다.
아주 간단한 내용을 함수(예를 들어 단순 덧셈 연산)로 만들면, 함수 호출의 오버헤드가 발생한다. 이는 차라리 함수의 로직을 그냥 함수화하지 않는 것이 좋을 수 있다.
인라인 함수란 짧은 코드로 구성된 함수에 대해, 함수 호출 오버헤드로 인한 프로그램의 실행 속도 저하를 막기 위해 도입된 기능이다. 인라인 함수 앞에 inline 키워드를 이용하여 선언할 수 있다.
함수를 호출하는 부분에 함수의 바디부분(로직 부분)을 그대로 복사하는 형태로 컴파일이 진행된다. 사실상 함수 호출이 발생하지 않는 것이다.
단순 덧셈 연산 뿐 아니라 간단한 getter/setter와 같은 함수들을 인하인 함수로 작성하면 프로그램의 실행 속도를 향상시킬 수 있다.
그러나 단점도 있다. 인라인 함수의 코드를 단순히 삽입하는 것이므로 호출하는 곳이 여러 군데 있으면 그 만큼 전체 크기가 늘어나는 단점이 있다.
=> Code segment 크기 증가!!!
=> 성능은 향상되지만, 메모리를 더 많이 잡아먹는 오버헤드가 존재.
int min(int x, int y) {
return x > y ? y : x;
}
int main() {
cout << min(5, 6) << endl;
cout << min(4, 2) << endl;
return 0;
}
위 min 함수를 인라인 함수로 만들면 두 번의 호출 오버헤드를 줄일 수 있다.
// 함수 인라인화
inline int min(int x, int y) {
return x > y ? y : x;
}
int main(){
// 컴파일러가 인라인 함수를 인-플레이스(in-place) 확장시킴
// 예를 들어 아래와 같다.
cout << (5 > 6 ? 6 : 5) << endl;
cout << (4 > 2 ? 2 : 4) << endl;
return 0;
}
인라인 키워드는 권장 사항일 뿐 컴파일러가 무조건적으로 인라인에 대한 요청을 받아들이진 않는다. 특히 긴 함수를 인라인화한다면 무시될 가능성이 있다.
다만 현대의 컴파일러는 자동으로 함수를 인라인화 하려 한다. 개발자가 직접 인라인 키워드를 사용하지 않더라도 컴파일러는 성능이 향상될 것으로 판단되는 것에는 인라인화를 자동으로 수행한다.