[C++] 인라인(inline) 함수

Kim Dongil·2023년 12월 5일
0

C++

목록 보기
20/23

일반적인 함수의 호출

일반적인 함수의 호출은 프로그램을 다른 주소(그 함수의 주소)로 점프 시켰다가, 함수의 처리가 종결되면 다시 원래의 자리로 돌아오는 것.

그 작업을 자세히 살펴보자면

프로그램이 함수 호출 명령에 도달했을 때, 그 함수 호출 명령 바로 다음에 있는 명령의 주소를 메모리에 저장하고, 스택에 매개변수를 복사한 후, 그 함수가 시작되는 메모리 위치로 점프한다.
그런 다음, 그 함수의 코드를 수행하고, 함수의 리턴값을 레지스터에 복사한 후, 저장해 두었던 주소의 명령으로 돌아온다.

이렇게 앞뒤로 점프를 수행하고, 점프할 위치를 기억하려면 함수를 사용하는 데 시간이 많이 걸린다.

C++ 인라인 함수

C++ 인라인 함수가 이 문제를 해결하기 위한 대안을 제공한다.

인라인 함수는 컴파일러가 함수 호출을 그에 대응하는 함수 코드로 대체한다. 함수를 그 자리에서 처리하므로, 그 함수를 수행하기 위해 프로그램이 다른 주소로 점프했다가 돌아올 필요가 없다. 따라서 인라인 함수는 일반함수보다 약간 빠르게 수행된다.

그러나 메모리 사용 측면에서는 인라인 함수가 일반 함수보다 불리하다. 어떤 프로그램에서 인라인 함수를 열 번 호출한다면, 프로그램은 그 함수의 사본을 프로그램의 코드 안에 열 번이나 삽입해야한다.

인라인 함수를 사용할 것인지 여부는 신중하게 결정해야 한다. 함수 코드 자체를 수행하는 데 걸리는 시간이, 함수 호출의 과정을 처리하는 데 걸리는 시간에 비해 매우 길다면, 전체적으로 절약되는 시간은 거의 없다. 즉 함수 코드를 수행하는데 걸리는 시간이 매우 짧을 경우에만 인라인 함수를 사용하는 것이 일반 함수를 사용하는 것보다 시간이 절약된다.

어떤 함수를 인라인으로 만들어 달라는 사용자의 요구를 컴파일러가 반드시 따르는 것은 아니다.
함수의 덩치가 크다는 이유로 또는 재귀 호출이라는 이유로 그러한 요구를 거절하는 컴파일러도 있다. (인라인 함수는 재귀 호출이 허용되지 않는다.)

일단 인라인 함수 => 대체적으로 헤더 파일에 들어 있어야 한다.
왜? => 대부분의 빌드 환경에서 인라인을 컴파일 도중에 수행하기 때문이다.

템플릿 => 대체적으로 헤더 파일에 들어 있어야 한다.
왜? => 템플릿이 사용되는 부분에서 해당 템플릿을 인스턴스로 만들려면 그것이 어떻게 생겼는지를 컴파일러가 알아야 하기 때문이다.

현대 컴파일러는 자동으로 함수를 인라인화 하는 데 매우 뛰어나다. 함수를 인라인으로 표시하지 않더라도 컴파일러는 성능이 향상될 것으로 생각하는 함수를 인라인화 한다. 따라서 대부분의 경우 inline 키워드를 사용할 필요가 없다.

소년코딩:티스토리
항목 30: 인라인 함수는 미주알고주알 따져서 이해해 두자.

0개의 댓글

관련 채용 정보