인라인 함수 (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
Posted by 긍정왕오킹