C++ inline functions

b4failrise ㅣ 2018. 2. 21. 21:17

inline 함수는 프로그램의 속도를 향상시키기 위해 고안된 C++ 향상이다. normal 함수(그냥 우리가 일반적으로 정의하는 함수)와 inline함수의 차이점은 코드를 짜는 방식이 아니라 C++ 컴파일러가 그 코드를 프로그램에 통합시키는 방식에 있다. 이 두 함수의 차이점을 이해하기 위해 프로그램의 내장을 들여다 볼 필요가 있다.

 

compile process의 마지막 결과물은 machine languege instructions(기계어 명령어)들로 구성된 실행가능한 프로그램이다. 프로그램을 실행했을 때, OS는 이러한 명령어들을 컴퓨터의 메모리에 load시키고 각 명령어들은 특정 memory address를 갖고 있다. 컴퓨터는 이러한 명령어들을 단계적으로(step-by-step) 처리한다. 때때로, loop나 branching statement(분기문) 를 가지고 있을 때, 프로그램 실행은 특정 주소로의 앞, 뒤로 점프를 하면서 명령어들을 뛰어다닌다. Normal 함수 호출은 또한 프로그램이 다른 주소로 점프하여 그 함수가 끝나면 다시 돌아온다. 이러한 Normal 함수의 전형적인 구현에 대해 좀 더 자세히 알아보자.

프로그램이 함수 호출 명령어에 도착하면, ¹프로그램은 함수를 호출하면서 즉시 명령어의 memory 주소를 저장하고, ²함수의 argument들을 STACK에 copy하고, ³함수의 시작을 나타내는 memory 위치에 점프하고, ⁴함수 코드를 실행한 다음 저장되었었던 명령어로 되돌아 점프하게 된다. 왔다갔다 점프를 하고 어디에 점프를 했는 지 계속 추적하는 것은 함수를 사용하는 데 있어 경과시간의 간접비용이 드는 것을 의미한다.                                                  Normal 함수의 상대적 단점

 

 

 

 

<출처: C++ Primer Plus>

 

 

그래서 C++ inline 함수는 그 대안을 제공한다. inline 함수에서는, 컴파일된 코드가 프로그램안의 다른 코드로 한 줄이 되는 것이다. 즉, 컴파일러는 함수호출을 상응하는 함수 코드로 대체한다. inline 코드를 사용하면, 프로그램은 위에서 처럼 왔다갔다 점프를 할 필요가 없다. 따라서 inline 함수는 Normal 함수보단 조금 더 빠르다. 그러나! memory penalty가 함께 뒤따른다. 만약 프로그램이 inline 함수를 10개의 다른 위치에서 호출한다면, 그 프로그램은 결국 코드에 그 함수를 10번 copy해야 한다.

 

따라서 우리는 inline 함수를 선별적으로 사용해야 한다. 만약 함수 코드를 실행하는 데 필요한 시간이 함수 호출 mechanism(Normal 함수 mechanism을 의미)을 조작하는 시간보다 길면, 절약되는 시간은 전체에서 상대적으로 얼마 안 된다.

쉽게 말해서, inline은 오로지 함수가 짧을 때만 사용되는 게 낫다!

 

반면에,  상대적으로 아주 빠른 mechanism process를 한다면(코드가 짧은 함수의 경우) 함수가 자주 호출되지 않는 이상 시간 절약에 별 차이는 없다.