본문 바로가기
Software/C++&MFC

inline 함수

by lovey25 2021. 4. 16.
반응형

인라인 함수는 함수를 호출하는데 소요되는 자원을 최소화하기 위해서 호출될 함수 블록 전체를 프로그램과 한 몸처럼 컴파일해서 실행되도록 하는 함수를 말합니다. 일반적인 함수는 특정 위치에 컴파일된 함수가 위치하고 호출이 될 때마다 함수가 있는 곳으로 와서 함수를 수행하고 다시 원래 프로그램으로 돌아가는 식으로 동작하지만 인라인 함수는 호출되는 위치들마다 함수 블록들이 위치하고 있어서 그 자리에서 바로 실행되는 것처럼 수행된다고 하네요.

오픈소스 프로젝트로 공부하다 보면 아래 사진처럼 inline이라는 키워드로 시작하는 함수를 종종 볼 수 있습니다.

inline 함수의 선언 예

바로 이런 형태가 인라인 함수가 사용된 부분인데요. 함수 선언할 때 맨 앞에 "inline"이라는 키워드만 추가해서 사용할 수 있습니다.

인라인 함수는 언제 사용하며 왜 사용할까요?

함수를 호출하는 것은 비교적 자원의 소모가 많이 필요한 과정이라고 합니다. 함수가 호출되면 레지스터를 저장하고 스택에 파라미터를 복사하고 함수를 실행하고 스택을 복구한 다음 다시 원래 위치로 돌아가는 이런 과정들을 거치게 된다고 하네요. 그래서 이런 과정을 오버헤드라고 표현한다면 오버헤드를 줄이기 위해서 함수를 인라인으로 만들면 프로그램이 실행되는 스트림에서 바로 함수가 실행될 수 있어서 오버헤드를 제거할 수 있습니다.

예를 들어 다음과 같이 add() 함수가 인라인 처리가 된다면,

inline int addone(int x) {
    return x++;
}

void main() {
	int a = 1;
	addone(a);
}

프로그램은 다음과 같은 코드처럼 실행되는 효과가 있는 거죠.

void main() {
	int a = 1;
	a++;
}

그리고 또 하나 이런 케이스도 있을 수 있는데, 만약, 비교적 아주 간단한 동작을 수행하는 함수가 있는데 이 함수가 팔망 미인이라 프로그램의 여기저기에서 무수히 많이 호출된다고 합시다. 이런 경우 함수 그 자체보다 오버해드가 더 커서 실제로 업무를 수행하는 것보다 함수를 호출하는 과정에서 소모되는 자원이 더 많아 호출을 할 때마다 손해를 본다면 호출 없이 함수를 코드에 일일이 모두 써줘야 하는데 그럴 때 인라인을 사용하면 되겠죠. 

그렇다면, 오버헤드와 비교해서 인라인 함수로 사용했을 때 이득을 보려면 어느 정도 함수를 인라인 처리해야 할지 의문이 생기는데, 여러 자료를 읽어보니 결론은 "신경 쓸 바 없다"인 것 같네요.

이유는, 우선 컴파일러에서 inline 키워드가 있다고 모든 함수를 인라인 처리하지 않습니다. 그리고 반대로 컴파일러가 판단했을 때 성능면에서 유리하다고 판단되면 inline 키워드가 없는 함수라도 인라인 처리하기 때문입니다. 요즘 컴파일러는 엄청 똑똑하데요.

다시 말해서 C++에 조예가 깊지 않은 저 같은 초보라면 인라인 따윈 신경 쓰지 말고 다른 문법 공부나 더 열심히 하면 되겠습니다. ㅎ

 

끝!

반응형

댓글