in-line 함수의 의미부터 파악해 보자. in은 ' 내부 '를 의미하고, line은 ' 프로그

램 라인 ' 을 의미하는 거이다. 즉 의역 해보면 " in-line 함수" 란 프로그램 라인
안으로 들어가버린 함수라는 의미를 지닌다.  

1] 매크로 함수의 정의와 장점

 우리는 C 언어를 공부하면서 매크로에 대해서 알게 되었다. 여기서는 이에 관

련해서 잠깐 복습을 하기로 하자. 매크로를 이용하면 다양한 일을 할 수 있는

데 그 중에서도 가장 대표적인 일은 함수를 만드는 일이다. 다음은 매크로를 이

용해서 함수를 정의하고 이를 호출하는 형태를 보여준다.  일반적인 순서에 의

해서 전처리, 컴파일, 링크 과정을 거쳐서 실행 파일이 생성될 것이다.  

 #include <iostream>

#define SQUARE(X)   ((X)*(X))

 int main(void)
{

       std::cout << SQUARE(5) << std::endl;

       return 0;
}

 그럼 위의 코드는 전처리 과정을 거치면서 어떻게 변하게 되는가? 다음 코드는
전처리 과정에 의해서 변경된 코드를 보여준다.

 #include <iostream>

 int main(void)
{

       std::cout << ((5)*(5)) << std::endl;

       return 0;
}

  위의 두 코드를 통해서 알 수 있는 사실은 무엇인가? 그것은 함수를 매크로로

정의하면 전처리기에 의해서 함수 호출 문장이 함수의 몸체 부분으로 완전히

대치돼 버린다는 것이다. 그렇다면 이를 통해서 얻게 되는 이점은 무엇인가? 함

수 호출 과정이 사라졌기 때문에 성능상의 이점을 맛볼 수 있다.( 함수 호출은

스택 메모리 공간의 할당도 요구하며 시간도 많이 요구된다.)

  위의 예제와 같이 함수 호출 문장이 함수의 몸체부분으로 완전히 대치되 버리

는 현상을 가리켜 " 함수가 inline화되었다." 라고 표현한다.

 참고) 매크로 함수에 대해서는 장점뿐만 아니라 단점도 알고 있어야 한다. 단

점은 함수의 구현이 까다롭고 디버깅하기 어려우며, 구현하고자 하는 함수의

크기가 크다면 프로그램의 크기가 커지게 된다는 것이다. 보자 자세한 사항은

C 언어 관련 서적을 참조하기 바란다.

 2] C++ 기반 함수의 in-line 화

 앞에서 매크로를 이용해서 함수를 in-line화 하였다. 이처럼 매크로를 이용해

서 C++의 함수도 in-line화 할 수 있다. 그러나 보다 쉬운 방법이 있다. 다음 예

제 코드는 앞에서 본 예제를 C++ 스타일로 in-line화 하고 있다.

#include <iostream>

inline int SQUARE(int x)
{
         return x*x;
}

int main(void)
{
       std::cout << SQUARE(5) << std::endl;

       return 0;
}

 함수를 정의하는 과정에서 키워드 inline을 붙여준 것을 제외한다면 일반적인

함수와 다를 바가 없다. 그렇다면 여기서 붙여준 키워드 inline은 무엇을 의미하

는 것일까? 이는 함수 SQUARE를 inline화 하라는 의미이다.

 정리하자! C++에서는 성능 향상을 목적으로 함수를 inline화 하기 위해서 매크

로를 사용할 필요가 없다. 다만 inline이라는 키워드만 붙여주면 되는 것이다.

얼마나 간편하고 좋은가?

 참고) 매크로를 이용한 함수의 in-line화는 전처리기에 의해서 처리되지만, 키

워드 inline을 이용한 함수의 in-line화는 컴파일러에 의해서 처리된다. 또한 컴

파일러에 따라서는 inline 선언이 오히려 성능 향샹에 해가 된다고 판단될 경우,
그냥 무시해 버리기도 한다.

'프로그래밍 > C,C++' 카테고리의 다른 글

[C,C++] 디폴트(DeFault) 매개 변수  (0) 2011.09.14
[C,C++] 이름공간(namespace)  (0) 2011.09.14
[C,C++] 가변 인자란 ...  (0) 2011.08.28
[C,C++] getchar() 의 문제점..  (2) 2011.08.28
[C,C++] scanf 와 fgets  (0) 2011.08.27
Posted by 바람처럼..
|