[C++] inline 함수란?

728x90
반응형

inline 함수

inline 함수는 매크로 함수를 대체할 수 있다.

#include <iostream>

#define SQUARE(x)  ((x)*(x))

// inline으로 정의
inline int square(int x)
{
    return x*x;
}

int main()
{
    // inline 함수를 호출
    std::cout<< square(5) << std::endl;

    // 매크로 함수를 호출
    std::cout<< SQUARE(12) << std::endl;
}

3번째 줄에서 정의한 #define SQUARE(x) ((x)*(x)) 매크로 함수와 6~9 번째 줄에 정의한 inline int square(int x)는 동일한 기능을 수행하는 함수다. 매크로 함수를 호출한 경우 전처리 과정을 거치면서 SQUARE(12)((12)*(12))로 대체된다. 이와 같이 함수의 몸체 부분이 함수 호출 문장을 완전히 대체 했을 때 함수가 인라인화 되었다. 라고 표현한다. inline 함수도 매크로 함수와 마찬가지로 함수 몸체 부분이 함수 호출 부분에 코드로 삽입된다.

매크로 함수와 inline 함수의 차이점은 코드를 처리하는 방법에 차이가 있다. 매크로 함수는 전처리기에 의해서 처리*되지만 *inline 함수는 컴파일러에 의해서 처리가 된다. 따라서 컴파일러는 함수의 인라인화가 오히려 성능 저하를 불러온다고 판단할 경우 inline키워드를 무시해버리기도 하고, 필요한 경우에는 일부 함수를 inline처리하기도 한다.

일반 함수와 inline 함수의 처리 과정 비교

일반 함수를 호출하게 되면 해당 함수의 메모리에 접근해 함수를 실행하고 다시 되돌아오는 과정을 거치게 된다. 이 과정에서 일정량의 자원 소모가 발생하게 된다.
일반함수 호출 관계

sum함수에 inline을 적용하면 함수 호출 과정 없이 함수에 있는 코드로 대체해 처리하기 때문에 성능저하를 예방 할 수 있다.

inline 함수

이렇게 처리 된다면 함수를 호출하는 과정 없이 sum의 내용이 코드로 대체되기 때문에 함수를 호출하는 과정에서 발생하는 Resource 소모는 발생하지 않고 더 빠르게 실행된다.

inline 함수의 한계

매크로 함수는 매개변수의 자료형이 없다. 즉 자료형에 의존적이지 않고 어떠한 값이 입력되어도 처리가 가능하다. 하지만 inline함수는 매개변수의 자료형이 존재하기 때문에 자료형과 일치하는 값을 전달해야 한다. 이 부분은 함수 오버로딩([[1. 함수 오버로딩(Function Overloading)]])을 이용하면 해결 가능하지만 Template([[템플릿(Template)]])을 이용하면 매크로 함수와 마찬가지로 자료형에 의존적이지 않은 inline함수를 만들 수 있다.

#include <iostream>

template <typename T>
inline T square(T x)
{
    return x * x;
}

int main()
{
    std::cout << square(5) << std::endl;
    std::cout << square(3.14) << std::endl;

    return 0;
}

inline 함수의 선언

inline키워드를 사용하는 함수는 선언부와 정의부 모두 Header 파일에 정의되어 있어야 한다. 또한 inline 함수가 지나치게 많으면 코드의 크기가 너무 비대해지기 때문에 캐시 미스 등의 성능 저하를 초래할 수 있다.

inline 함수 사용시 주의사항

  1. 컴파일러가 함수의 내용을 분석해 임의로 적절한 위치에 코드로 삽입하기 때문에 inline함수를 여러 차례 호출하면 코드 사이즈가 더 커질 수 있다.
  2. inline 은 필수 사항이 아닌 권장사항이기 때문에 inline함수의 코드가 너무 길다면 컴파일러는 inline을 처리하지 않고 무시할 수 있다.
  3. 최신 컴파일러는 함수를 적절하게 inline 화하기 때문에 굳이 inline을 사용할 필요는 없다.
728x90
반응형