SW/C++

C++11 : 인라인 함수에 대해 알아볼까요? (개념 및 예제)

얇은생각 2019. 1. 1. 07:30
반응형

인라인이라는 단어 그대로의 의미는 줄 안쪽을 의미합니다. 실제 인라인 함수의 의미와도 일맥상통합니다. 일반 함수와 호출 과정부터 비교해보며 예제를 통해 알아보겠습니다.


함수 호출은 보통 메모리상의 점프를 이용하며, 여러 가지 상태 정보 등을 저장하고 복원해야 하므로 내부적으로 복잡한 과정을 거칩니다. 인라인 함수를 사용하면 복잡한 함수 호출 과정을 단순하게 대체할 수 있습니다.


인라인 함의 문법은 다음과 같습니다. 일반 함수와 같은 형태이지만 inline 키워드로 시작하는 점이 다릅니다.


inline 반환형 함수명(매개변수 목록);


인라인 함수가 앞에서 배운 일반 함수와 어떻게 다른지 다음 예제를 보면서 비교해보겠습니다.


#include <iostream>
using namespace std;
 
class Chulsoo
{
public:
    void Eat(int SteakWeight);
    inline void EatInline(int SteakWeight); // 인라인 함수 선언
};
 
int main(void)
{
    Chulsoo chulsoo;
    chulsoo.Eat(500);
    chulsoo.EatInline(500); // 인라인 함수 호출
    return 0;
}
 
void Chulsoo::Eat(int SteakWeight)
{
    cout << "Eat() :: 철수는 " << SteakWeight << "g 짜리 스테이크를 먹는다" << endl;
}
 
inline void Chulsoo::EatInline(int SteakWeight) // 인라인 함수 정의
{
    cout << "EatInline() :: 철수는 " << SteakWeight << "g 짜리 스테이크를 먹는다" << endl;
}
cs


인라인 함수를 구현하는 방법은 간단합니다. 함수를 선언하고 정의할 때 inline이라는 키워드로 시작하고 호출은 일반 함수와 같습니다. 함수의 형태나 실행 결과가 일반 함수와 크게 다르지 않습니다. 두 함수의 차이점을 좀 더 명확하게 보도록 하겠습니다.


#include <iostream>
using namespace std;
 
class Chulsoo
{
public:
    void Eat(int SteakWeight);
    inline void EatInline(int SteakWeight) // 인라인 함수 선언 및 정의
    {
        cout << "EatInline() :: 철수는 " << SteakWeight << "g 짜리 스테이크를 먹는다" << endl;
    }
};
 
int main(void)
{
    Chulsoo chulsoo;
    chulsoo.Eat(500);
    chulsoo.EatInline(500); //인라인 함수 호출
    return 0;
}
 
void Chulsoo::Eat(int SteakWeight)
{
    cout << "Eat() :: 철수는 " << SteakWeight << "g 짜리 스테이크를 먹는다" << endl;
}
cs


코드는 처음과 다릅니다. 하지만 결과는 같습니다. 인라인 함수의 선언과 정의를 동시에 하도록 변경하였습니다. 일반 함수와 인라인 함수가 어떻게 다르고 장단점인 무엇인지 알아보겠습니다.


일반 함수와 인라인 함수의 동작 방식을 비교하면 일반 함수가 조금 더 복잡합니다. 인라인 함수는 1단계로 간단하게 인라인으로 선언하면 컴파일러가 해당 함수의 코드 전체를 호출한 코드 위치로 모두 복사하여 대체하기 때문입니다. 따라서 함수 호출 단계가 줄어 복잡한 과정이 생략되어 함수의 동작 방식이 더 간단해지고 성능이 향상됩니다.


인라인 함수만 사용해야 할 것 같지만, 인라인 함수가 항상 좋은 것은 아닙니다. 인라인 함수를 100번 넘게 호출을 하면 컴파일 이후 실행 파일의 크기는 커지게 됩니다. 또 모두 인라인 함수를 개발한다면 전체 코드의 양이 늘어나기 때문입니다.


그러나 정의부가 길지 않을 때는 인라인 함수를 사용하는 것이 좋다고 할 수 있습니다. CPU, 메모리 등의 성능이 중요한 임베디드 환경에서는 인라인 함수를 잘 이용하면 성능에서의 이득을 볼 수 있습니다. 하지만 인라인 함수는 컴파일러가 최적화를 하면서 인라인 함수처럼 사용할 것인지 말 것인지 판단하므로, 이 부분도 유념하여 사용해야 합니다. 


인라인 함수 장점

함수 정의부가 실행 코드를 대체 하므로, 실행 상 오버헤드를 줄여서 실행 속도가 빠르다.


인라인 함수 단점

함수 정의부가 길면 인라인 함수를 사용하여 얻을 수 있는 장점이 줄어든다.


인라인 함수의 중요한 특징

컴파일러의 최적화 방법에 따라서 컴파일러가 일반 함수를 인라인 함수로 취급하여, 실행 파일을 만들 수 있습니다. 거꾸로 컴파일러가 inline 함수를 일반 함수로 취급하여 실행 파일을 만들 수 있습니다. 


인라인 함수는 함수 선언과 정의가 한곳에 있고 함수 호출문이 모두 함수 정의로 대체된다고 하니, 코드를 읽을 때 시선을 여기저기 옮기지 않아도 돼서 가독성이 좋을 것으로 생각 할 수 있습니다. 하지만 호출문이 정의로 대체되는 시점은 컴파일 이후입니다. 


인라인 함수에 아쉬움이 있는 분이 계신가요? 그렇다면 람다 함수를 사용하면 그 아쉬움을 어느정도 해소 할 수 있습니다. 다음 번에는 람다 함수에 대해 포스팅 하겠습니다.

반응형