프로그래밍 언어/C & C++ 정리

인라인 함수

게임 개발 2023. 1. 9. 15:01

inline 함수라는 이름의 의미는 in은 내부, line은 프로그램 코드라인을 의미한다.

프로그램 코드라인 안으로 들어가 버린 함수라는 뜻으로

 

일반적인 함수에 비해서 실행속도의 이점이 있다.

 

이유는 함수의 호출 방식에 대한 차이 때문이다.

일반 함수를 호출하는 경우 메모리에 일반 함수의 코드를 저장하고,

함수를 호출했을 때 해당 함수의 주소로 점프하여

해당 함수의 코드를 실행하고 다시 원래 자리로 돌아와야 한다.

 

그에 반해 인라인 함수는 함수 호출 코드에

직접 인라인 함수의 코드가 치환되어 실행되기 때문에

주소영역 점프가 필요하지 않아 함수의 실행속도가 더 빠른 것이다.

 

이를 함수 호출의 프로그램 내부 구조로 풀어보면

 

일반적인 함수는

 

작성한 코드 프로그램을 실행 ->

명령들을 컴퓨터 메모리에 로드 ->

로드된 명령들은 각각 하나의 특정 메모리 구조를 갖는다 ->

명령어들을 순차적으로 실행 ->

루프나 분기문을 만나면 특정 주소로 명렁을 건너뜀 ->

함수 호출 명령을 수행 ->

함수 호출 명령에 도달하고 그 다음에 있는 명령의 주소 메모리(스택)에 저장한다 ->

스택에 매개변수를 복사한 후 , 그 함수가 시작되는 메모리 위치로 이동한다 ->

함수 실행

 

의 과정을 거친 뒤

 

함수의 리턴 과정으로

 

함수가 종료 ->

함수의 리턴 값을 임시 저장소에 저장 ->

스택에서 호출시점으로 가서 주소 값을 꺼내옴 ->

호출된 시점으로 복귀

 

 

인라인 함수와 비슷한 개념으로 c언어에 있는 것은

매크로 함수이다.

 

plus

매크로 함수는

c언어에서 #define 함수로 실행처리 지시문에 인수로

함수의 정의를 전달함으로써, 함수처럼 동작하는 매크로를 만들 수 있다.

 

 

매크로 함수에는 있지만, 인라인 함수에는 없는 장점

 

사실 인라인 함수는 매크로 함수의 장점을 완전히 대체하지는 못하였다.

사실상 매크로함수는 코드 압축의 순기능의 이익이 있다.

하지만 매크로 함수는 전처리기로 이루어지기 때문에

컴파일 직전에 실행되기 때문에 디버깅이 어렵다.

 

매크로 함수가 다음과 같이 정의되면 이하와 같다.

 

#define              SQUARE ( x )   ((x)*(x))

 

이는 자료형에 의존적이지 않은 함수가 된다.

하지만 다음과 같이 정의된 인라인 함수는 만약 이하와 같이 정의 된다면,

 

inline   int          SQUARE(int x)  {return x*x;}

 

int형 기반으로 정의된 함수이기 때문에

다음의 함수호출 문장에서 데이터 손실이 발생한다.

 

재귀함수도 인라인이 가능하다.

force inline 했을 경우, 중복 호출은 16개 까지만 가능하다.

 

사실상 inline은 컴파일의 판단 하에 이루어지는 것이고

force inline은 컴파일 시 조금 더 무리한 부탁을 요구하는 것이다.

때문에 컴파일 시에 무시될 수도 있지만, 어지간하면 끼워준다.

 

포폴 만들 때, inline 말고 쓸 것이면 forceinline 쓰자.

* "getter 혹은 setter 위주로 인라인을 쓴다." *

 

코드가 많아지면 프로그래밍이 커지니까

개발사 재량으로 inline 사용한다.

 

인라인 메서드

 

클래스 선언 안에 정의를 가지고 있는 모든 함수는 자동으로 인라인 함수가 된다.

클래스 선언은 짧은 멤버 함수들에 대해서 인라인 함수를 사용하는 경우가 많다.

 

원한다면 클래스 선언의 외부에 멤버 함수를 정의하고, 그것을 인라인 함수로 만들 수 있다.

그렇게 하려면, 클래스 세부 구현 부분에서 그 함수를 정의할 때 inline이라는 제한자를 앞에 붙이면 된다.

 

인라인 함수에 적용되는 특별한 규칙은, 인라인 함수들은 그들이 사용되는 각각의 파일에서 정의될 것을 요구한다.

다중 파일 프로그램을 구성하는 모든 파일에서 인라인 정의를 사용하는 가장 쉬운 방법은,

해당 클래스가 정의되어 있는 헤더 파일에 인라인 정의를 함께 넣는 것이다.

(일부 C++ 시스템의 스마트 링커는 인라인 정의를 하나의 독립된 구현 파일에 넣는 것을 허용한다.)

 

 

매크로 함수에는 있지만 인라인 함수에는 없는 장점

 

#define SQUAER(X) ((X)*(X))

해당 매크로 함수는 자료형에 의존적이지 않은 함수이다.

따라서 int형 함수호출 및 double형 함수호출 모두 가능하다.

 

때문에 매크로 함수의 장점인 일반적인 함수에 비해서 실행속도가 빠른 이점있지만,

매크로 함수는 복잡한 함수를 매크로 형태로 정의하는데 한계가 있다.

 

C++에서는 매크로 함수의 장점 실행속도의 이점과

일반 함수의 정의방식을 이용한 인라인 함수를 이용할 수 있다. 

'프로그래밍 언어 > C & C++ 정리' 카테고리의 다른 글

c++ 함수 구문  (0) 2023.01.13
main 함수의 머리  (0) 2023.01.11
C++ 기초 플러스 단원 정리  (0) 2023.01.08
전처리 지시자  (0) 2023.01.08
동적 할당 함수  (0) 2023.01.07