쓰게 된 계기

어느날 https://godbolt.org/ 라는 서비스로 열심히 즐겁게 이것 저것 해보다가 inline함수를 써봤습니다.
그런데 매크로 같이 바로 들어가지지 않고 다른 함수들과 다를게 없이 function을 그냥 call하고 있었습니다.

그래서 인라인 함수란 무엇이고 컴파일러가 인라인 처리하는 경우에 대해서 적어보고자 합니다.

what is 인라인 함수

인라인 함수는 cplusplus.org의 글에 의하면 다음과 같은 목적을 가지고 있습니다.

  1. 함수 호출 오버헤드를 피하여 속도를 향상시킨다.
  2. 변수를 push/pop하면서 생기는 오버헤드를 줄인다.
  3. 함수 호출을 반환할 때 생기는 오버헤드를 줄인다.
  4. 명령어 캐싱을 활용, 변수 참조의 인접성을 높여 속도를 향상시킨다.

간략히 정리해보면 함수 호출로 인한 오버헤드를 줄이고 명령어 캐싱 등을 통해 속도를 향상시키고자 할 때 사용하는 것입니다. 간단히 그림으로 그려볼까요?

call_function.png

그림과 같이 메인에서 add를 호출하면 ip (instruction pointer) 가 add 영역으로 넘어가서 실행후 종료되면 다시 main에서 add를 호출했던 곳으로 이동합니다. 이러한 과정에서 프로그램은 서브루틴 처리후 호출한 루틴으로 돌아가기 위해, 그 흐름을 저장하기 위해서 스택 프레임이라는 것을 사용합니다.

목적에 말하는 오버헤드는 이런 스택프레임을 생성하는 과정에서의 오버헤드를 말하는 것입니다.

물론 inline도 자칫하면 바이너리의 크기를 매우 크게 키워버리는 사태를 만들어 버릴 수 있으니 조심해야합니다.

인라인 인 코드

코드에서는 다음과 같이 작성합니다

inline int add(int x, int y) {
 return x + y; 
}

inline, just hint

inline을 사용할 때, 나와 같은 의문을 품고 고민한다면 알아둬야 할 것이 있습니다.
inline은 그저 compiler에게 힌트를 주는 것일 뿐 인라인 처리를 하고 안 하고는 compiler에 따라 다릅니다.

g++의 경우에는 인라인 처리를 해줄 때 다음과 같은 옵션을 주어 처리하였습니다. 하지만 이 경우의 문제점은 inline이 아닌 함수도 inline처리가 되었다는 점입니다. 이 점에대해서는 더 찾아봐야 할 것 같습니다.

g++ main.cc -o bin -O3

마무리

피드백 부탁드립니다 :D