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

조재훈·2024년 2월 10일

개요

인라인 함수는 C++의 실행 속도 개선을 위해 등장했다
C++에서 간단한 기능을 하는 비교적 짧은 코드의 함수들이 있는데 이 함수들이 간결해 실행속도에 영향을 끼치지 않을 것 같지만 함수 호출 과정에서 프로그램 속도가 떨어지게 된다

C++에서의 함수 호출 과정

  1. C++에서 함수가 호출되면 우선 스택에 함수로 전달할 매개변수와 함께 호출이 끝난 뒤 돌아갈 반환 주소값을 저장함
  2. 프로그램 제어가 함수의 위치로 넘어와 함수 내 선언된 지역 변수도 스택에 저장함
  3. 함수의 모든 코드를 실행하고, 실행이 전부 끝나면 반환값을 넘겨줌
  4. 프로그램 제어가 스택에 저장된 돌아갈 반환 주소값으로 이동해, 스택에 저장된 함수 호출 정보를 제거

함수를 실행하는 시간이 오래 걸린다면, 함수를 호출하는데 걸리는 시간은 문제가 되지 않지만 함수의 실행 시간이 매우 짧다면(코드 길이가 짧음), 함수 호출에 걸리는 시간이 부담스러워짐
이런 과정이 엄청 많이 반복되면 리소스가 불필요하게 많이 사용하게 된다
이것이 바로 오버헤드 현상이고 이를 해결하기 위해 등장한 것이 inline 키워드이다

인라인 함수

인라인 함수는 호출될 때 위와 같은 일반적인 함수의 호출 과정을 거치지 않고, 함수의 모든 코드를 호출된 자리에 바로 삽입하는 방식의 함수이다
이 방식은 함수를 호출하는 데 걸리는 시간은 절약되나, 함수 호출 과정으로 생기는 이점들을 포기하므로 코드가 매우 적은 함수만 인라인 함수로 선언하는 것이 좋다

선언

inline 함수 원형
or
inline 함수 정의

함수 이름 앞에 inline 키워드를 붙이면 컴파일러가 인라인 처리를 해준다
인라인 처리가 되면 실제 컴파일러가 코드를 어떻게 변환하냐면

inline int sum(int a, int b)
{
	return a + b;
}

int main()
{
	int result = 0;
    // result = sum(1, 2); 이 코드가 컴파일러에 의해
    result = 1 + 2; // 이렇게 바뀐다
    
    return 0;
}

그 외에도 inline과 동일한 역할을 하는 키워드 __inline이 있다

알아두어야 할 것

  • 인라인 함수는 재귀 호출이 허용되지 않는다
  • 인라인 함수를 불필요하게 많이 사용하면 전체 프로그램의 코드의 길이가 길어져 실행파일 크기가 커지고 컴파일 속도가 느려진다
  • 컴파일러는 재량껏 인라인으로 선언되어 있지 않은 함수인데도 인라인화하면 좋을 것 같다고 판단되면 인라인화 시키거나 인라인으로 선언되어 있어도 불필요하다고 생각되면(코드 길이가 길어서) 함수를 인라인으로 처리하지 않는다
    • 그러나 __forceinline 이라는 키워드를 보면 이름에서 유추하듯이 컴파일러에게 강제로 인라인화하라고 명령해서 컴파일러에게 명령을 더 쌔게 할 수도 있다
    • 무차별적으로 사용하면 프로그램의 성능이 저하될 수 있으니 신중하게 사용해야 됨
    • 반대로 인라인 하지 말라는 noinline 키워드도 있다

정리

정리하자면 인라인 함수는 함수 호출 시 생기는 오버헤드를 최소화하고 컴파일 최적화 등의 장점을 제공하지만, 잘못 사용 시 오히려 성능의 저하를 초래할 수 있는 기능이다

참고

TCP스쿨
HwanShell

profile
나태지옥

0개의 댓글