본문 바로가기
오래된 글

C++ inline function

by pagehit 2019. 10. 24.
반응형
inline int add(int a, int b)
{
    return a+b;
}  

인라인 함수inline function는 C++의 특징 중 하나입니다. 인라인 함수를 사용하는 이유는 무엇일까요?

소스 코드를 실행시키면 메인 함수가 먼저 실행되고, 메인 함수에서 다른 함수들을 호출할 것입니다. 다른 함수를 호출할 때, 호출된 함수의 매개 변수, 반환 주소 등이 메모리 스택에 저장됩니다. 이 과정에서 메모리에 접근에 값을 써야 해서 오버헤드overhead가 발생합니다. 즉, 물리적인 메모리 공간을 접근해 값을 써야 하므로 그 만큼 시간이 많이 걸립니다. 이러한 함수 호출 오버헤드function call overhead를 줄이기 위해 인라인 함수를 사용합니다.

인라인 함수를 사용하면 어떤 일이 벌어질까요? 인라인 함수를 호출하면, 인라인 함수를 호출한 곳에 인라인 함수 전체 코드를 집어 넣습니다. 메인 함수가 실행되는 줄기에 인라인 함수 코드가 원래 있었던 것 마냥 코드를 삽입해 함수 호출이 일어나지 않습니다. 따라서 오버헤드를 줄일 수 있습니다. 이러한 코드의 삽입은 컴파일 타임에 컴파일러가 수행합니다.

그렇다면 언제 인라인 함수를 사용해야 할까요? 언제 사용해야 효율적인 것일까요? 함수를 호출하는 오버헤드보다 호출된 함수의 실행시간이 훨씬 길다면, 인라인 함수를 사용할 필요가 없습니다. 함수의 실행시간이 짧고, 같은 함수가 여러 번 호출되어 함수를 호출하는 오버헤드가 길어지면 인라인 함수를 사용할 수 있습니다.

inline은 프로그래머가 컴파일러에게 보내는 요구 사항입니다. modern compiler는 자체적으로 inline 키워드가 있더라도 효율적이지 않다면 인라인 함수를 만들지 않습니다. 예를 들어, 함수가 재귀적으로 많이 호출되거나, 반복문이 있는 경우, 표준 입출력이 있는 경우 함수 실행 시간이 길어지므로 inline을 수행하지 않습니다.

그러면 inline과 macro의 차이는 무엇일까요? 매크로도 전처리기에 의해 소스 코드 내부에 삽입됩니다. 큰 차이가 없어 보이지만, C++을 창시자 Bjarne Stroustrup은 C++에서 매크로보다는 inline을 사용해야 한다고 말합니다. C++에서 매크로는 클래스의 private 멤버에 접근할 수 없습니다. 아래와 같은 코드를 작성하면 에러가 납니다. 매크로는 전처리기가 처리하고, 인라인은 컴파일러가 처리합니다.

#include  

class Sample 
{ 
    int member; 
public: 
#define SAM(Sample::member)    // error 
};

결론

인라인 함수를 남발하면 안됩니다. 함수 실행 시간이 짧으면서 많이 호출될 때 사용하면 효율적입니다. 함수 body에서 표준 입출력 한 줄만 있더라도 이는 함수 실행 시간이 길어지므로, 인라인을 사용하지 않는 것이 좋습니다.

반응형

댓글