마이 플밍 블로그

C++ 인라인 함수(inline function) 본문

Code/C, C++

C++ 인라인 함수(inline function)

레옹 2021. 10. 14. 08:18

함수는 사용될 때마다 일정량의 오버헤드를 발생시킨다.

CPU가 함께 실행중인 다른 레지스터와 함께 사용 중인 함수의 주소를 저장해야 해서 모든 함수 매개 변수를 생성해야 한다. 할당 된 값을 사용한다면 프로그램이 새 위치로 분기된다. 내부에서 작성 된 코드가 더 빠르다.

 

함수 호출시 다음과 같은 과정을 거치게 된다.

 

함수 호출 -> 호출 된 시점의 함수 주소 값 스택에 저장 -> 함수 매개변수 스택에 저장 -> 함수실행

 

함수 종료 -> 함수 리턴 값을 임시 저장소에 저장 -> 스택에서 호출 시점 주소 값 가져옴 -> 호출 시점으로 복귀

 

 

엄청 큰 함수 몇개만 사용한다면 큰 문제는 없지만 작은 함수 여러개를 쓴다면 많은 성능저하가 일어날 것이다.

 

컴파일러에서는 이런 오버헤드를 줄이기 위해 스스로 코드를 최적화를 해준다.

 

 

int Add(int a, int b){
   return a + b;
}

int main(){
   int sum = Add(2, 5);
   return 0;
}

만약 이렇게 얼마 되지 않는 크기의 작은 함수들이 사용 될 때마다 스택에 주소를 저장 했다 가져오는 행위를 반복한다면 성능에 큰 영향을 주는데 이것을 오버헤드(overrhead) 라고 한다

 

컴파일 과정

프로그램 작성 -> 컴파일 -> 링크 -> .exe 실행

 

컴파일은 작성한 코드를 컴퓨터가 알아보기 쉽게 기계어로 변환하는 작업을 말한다.

컴파일이 완료되면 .obj 파일이 생성된다.

 

컴파일은 프로그램의 실행이 아니라 말그대로 기계어로

번역의 의미를 지니며 함수에 대한 실행은 여기선 이뤄지지 않는다.

때문에 해더파일에 선언된 함수들. 즉, 실행코드에 사용될 라이브러리(함수들)를 연결시켜 주는 과정이 링크 이다.

 

Inline 함수는 이런 컴파일 과정에서 처리가 된다

Inline 함수를 선언하는 방법은 함수 앞에 Inline을 붙여주기만 하면 된다

 

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

int main(){
   int sum = Add(2, 5);
   return 0;
}

 

이렇게 하면 프로그램 실행시 다음과 같이 바뀌게 된다

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

int main(){
   int sum = 2 + 5;
   return 0;
}

함수호출 부분이 없어지고 함수의 내용이 복사본으로 대체가 된다.

실제로 어셈블리로 확인할 시 함수 호출 부분이 사라지고 main부분만 실행되는 것을 확인 할 수 있다.

 

이러한 이유 때문에 inline 함수를 선언시 속도가 빨라지게 된다.

그러나 inline 함수가 많아지게 되면 컴파일 속도가 느려지고 함수 선언 부분이 복사본으로 대체가 되기 때문에 inline 함수가 클수록, 선언 된 곳이 많을 수록 실행파일 크기가 커진다.

그러므로 inline 함수는 내부 루프가 없는 짧은 함수에서만 사용하도록 하자.

 

이렇게 inline 함수를 사용해서 크기가 너무 커질거 같은 경우에는 컴파일러에서 자동으로 inline화를 시키지 않는다.

 

Inline 함수 장점

1.실행속도가 빨라진다

단점

1. 파일 크기가 커지게 된다.

2. 컴파일 속도가 느려진다.

 

이렇게 inline 함수에 대해서 알아봤지만 사실 inline 함수는 사용할 필요가 거의 없다시피하다.

사실 inline 함수를 쓸 필요없이 컴파일러에서 성능향상이 될 만한 함수에 자동으로 inline화를 해준다. 

 

 

 

'Code > C, C++' 카테고리의 다른 글

[C++]Vector와 List의 차이  (0) 2022.03.14
[C, C++] memset 함수의 사용법  (0) 2022.01.11