2010년 1월 29일 금요일

인라인 함수

보통의 함수 호출은 오버헤드를 갖는다. 이것은 호출을 설정하고 인수를 전달하며 함수로 들어가고 반환되는 함수 프롤로그과정 때문에 시간이 걸린다는 의미이다.
C99에서는 함수를 인라인 함수로 만드는 것이 가능한 빠른 함수호출을 요청한다고 한다.

#include <stdio.h>
inline void eatline()  //인라인 함수 정의
{
   while(getchar() != '\n')
      continue;
}
int main(void)
{
   ...
   eatline();
   ...
}
인라인  선언을 보면서, 컴파일러는 eatline()함수 호출을 함수 보디로 대체할 수 있다. 다시 말해서, 다음과 같은 코드를 쓰는 것과 동일한 효과가 나타난다.
#include <stdio.h>
inline void eatline()  //인라인 함수 정의
{
   while(getchar() != '\n')
      continue;
}
int main(void)
{
   ...
    while(getchar() != '\n')  // 대체된 함수 호출
      continue;
   ...
}

인라인 함수는 이 함수르 위해 따로 설정된 개별 코드 블록을 갖지 않기 때문에, 함수의 주소를 가질수없다
(주소를 가질수 있으나 컴파일러가 비 인라인 함수를 생성할 것이다.) 또한 인라임 함수는 디버거에 나타나지 않는다.
인라인 함수는 짧아야한다. 긴 함수의 경우 함수 호출하는 시간이 함수 바디를 실행하는것 보다 짧다.
인라인 함수는 컴파일러가 함수 정의 내용을 알아야하기 때문에 동일한 파일 내에 있어야하는 내부 링키지를 가져야 한다. 다만 헤더파일에는 포함될수 있다. 사용자 정의된 헤더를 파일에 include시키면 되기 때문이다

//file1.c
inline double square(double);    // 인라인 함수선언
double square(double x){return x * x;}   // 외부 링키지 선언

//file2.c
extern double square(double);    // 외부 함수 선언
double square(double x) {it y; y = x*x; return y;}

//file3.c
extern double square(double);   // 외부 함수 선언

위와 같은 경우 file1c는 인라인버전을 사용할 수 있으나 file2.c, file3.c는 외부 함수 정의를 사용한다.

extern double square(double);    // 외부함수로 선언
inline double square(double);     // 인라인 함수로 선언
double square(double x){return x * x;}  // 외부링키지로 선언
int main()
{
   double q =  square(1.3) + square(1.5);  // 어떤 square를 써야하나??
   return 0;
}

컴파일러는 이중 하나로 자유롭게 사용을 한다. 그렇다면 이런 구문은 쓰지 않아야 마땅하다.

댓글 없음:

댓글 쓰기