인라인 함수 (inline function)
인라인 함수는 함수 호출 시 발생하는 오버헤드를 줄이기 위해 함수를 호출하는 대신 함수가 호출되는 곳마다 함수의 코드를 복사해 넣어주는 방법입니다.
- 인라인은 새로운 종류의 함수가 아니라 함수에 적용할 수 있는 새로운 특성입니다.
그럼 오버헤드는 뭘까요
실제로 함수가 호출되는 과정은 상당히 복잡합니다.
- 함수의 인자를 스택에 저장 -> 함수가 리턴될 때 돌아올 주소를 스택이나 레지스터에 저장 -> 함수의 시작 주소로 점프 -> 함수의 코드 실행 -> 함수에서 만들어진 지역변수, 스택에 저장된 인자 해제, 리턴값을 레지스터에 저장 -> 함수를 호출할 때 저장해둔 주소(다음에 수행할 문장의 위치)로 되돌아갑니다.
이렇듯 몇 개의 명령어로 구성된 간단한 함수를 호출하기 위해 함수의 호출 준비나 함수의 리턴을 위해 몇 십개의 명령어를 수행해야한다면 말 그대로 오버헤드가 될 수밖에 없습니다.
이런 오버헤드를 줄이기 위해 C++에서는 인라인 함수라는 기능을 제공합니다.
- 성능 향상을 위해 필요하겠죠?
인라인 함수가 가지는 일반 함수와의 가장 큰 차이는
함수 호출이 일어나는 것이 아니라 함수가 호출 되는 곳에 함수의 코드를 넣어준다는 점입니다.
결국, 인라인 함수는 위와 같다고 보시면 되겠습니다.
- Sum(a, b) -> a + b // 호출이 일어나지 않습니다!
주의할 점!
인라인 함수를 사용하면 프로그램의 실행 속도는 빨라지지만 프로그램의 크기가 커지는 단점이 있습니다.
- 간단한 함수만 인라인 함수로 사용합시다.
- 재귀함수, 가상함수, 함수에 대한 포인터를 사용해야하는 경우는 인라인 함수로 선언하더라도 인라인 함수가 되지 않습니다.
- 인라인 함수의 정의는 헤더 파일에 포함되어야 한다는 것. (함수의 모든 구현 내용도 함께 있어야 합니다)
* 이유는 인라인 함수는 호출 전에 반드시 정의가 필요합니다.
* 함수 정의가 있어야지 호출 시 필요한 코드를 바로 넣어줄 수 있기 때문 (선언만 넣으면 안되요!!)
매크로 함수와의 차이점
매크로 함수라 함은 #define을 이야기합니다.
매크로 함수는 컴파일 전 단계인 선행처리기(preprocessor)에서 처리됩니다.
인라인 함수는 컴파일러에 의한 코드 대치 방식으로 호출될 코드를 삽입합니다.
백문이 불여일견! 이 둘의 차이를 볼까요
매크로 함수의 경우 650
인라인 함수의 경우 2100
- 매크로 함수 : 10 + 20 * 30 + 40 을 계산하기 때문에 연산자 우선순위에 의해 10 + (20 * 30) + 40이 됩니다.
* #define MACRO_MUL(x, y) ((x) * (y)) 와 같은 형태로 연산자 우선순위 문제를 해결할 수 있습니다.
- 인라인 함수 : (10 + 20) * (30 + 40)으로 계산합니다. 일반적인 함수를 호출할 때 처럼 인자의 값을 먼저 계산한 다음 함수 호출이 수행됩니다.
- 매크로 함수의 경우 실제 함수 호출이 일어나는 것이 아니기 때문에 인자의 형 검사를 하지 않습니다. 잘못된 인자를 넘겨주더라도 컴파일 단계에서 찾을 수 없는 경우가 있습니다.
- 인라인 함수의 경우 형 검사를 하기 때문에 inline_Sum 함수는 에러가 발생하여 주석처리를 했습니다.
매크로 함수보다는 인라인 함수를 사용하는게 여러모로 좋습니다.
'Programming Language > C/C++' 카테고리의 다른 글
C 헤더파일 중복검사 (0) | 2014.10.10 |
---|---|
C++ 네임스페이스 (0) | 2014.10.10 |
C 배열과 포인터 (0) | 2014.10.10 |
C 포인터 (0) | 2014.10.10 |
C 삼항연산자 (0) | 2014.10.09 |