게임 개발/C++

[C++] inline 함수 - 1. 특징

유행성바코드 2025. 2. 28. 17:32

목차

  • 01. Intro
  • 02. inline 함수
    • 정의 및 특징
    • 장점
    • 단점
    • 주의할 점
  • 03. 마무리
  • 04. 연관 내용

01. Intro

오늘은 인라인(inline) 함수에 대해 알아보겠습니다.

 


02. inline 함수

 

정의 및 특징

#include <iostream>

using namespace std;

// 인라인 함수 선언 및 정의
inline int area(int w, int h)
{
	return w * h;
}

int main()
{
	int result = area(3, 5);
	cout << result << endl;

	return 0;
}

 

위 코드를 보면, 인라인 함수는 함수의 반환형 앞에 inline 키워드를 붙입니다.

 

코드를 실행하면, 인라인 함수를 호출한 부분이 인라인 함수의 구현부 내용으로 변환됩니다.

즉, area(3,5)는 함수 본문인 3 * 5로 반환됩니다.

따라서, 실행할 때, 아래 코드처럼 실행됩니다.

 

int main()
{
	// 인라인 함수로 인해 실행할 때, 아래 코드처럼 실행됨.
	int result = 3 * 5;
	cout << result << endl;

	return 0;
}

 

이렇게, 함수 호출을 코드로 변환하므로 함수 호출과 관련된 비용이 발생하지 않습니다.

 

즉, 함수를 호출할 때 생성되는 스택 프레임이나 레지스터 저장 등의 오버헤드가 발생하지 않습니다.

 

장점

인라인 함수를 사용할 때, 장점은 아래와 같습니다.

 

1. 함수 호출 오버헤드 감소

함수 호출할 때, 생성되는 스택 프레임, 레지스터 저장, 매개 변수 전달이 필요 없습니다.

따라서, 함수 호출에 대한 오버헤드가 감소해 성능이 향상될 수 있습니다.

그러므로 인라인 함수는 주로 성능이 중요하며 짧은 코드를 가지고 있고 자주 호출되는 함수에서 주로 사용됩니다.

 

2. 명확한 가독성

함수를 분리하면서도 실행 시에는 코드로 변환됩니다.

이는 매크로 정의 지시어인 #define 보다 안전하게 사용할 수 있습니다.

이에 대한 내용은 추후에 다루겠습니다.

 

단점

1. 실행 파일 크기 증가

인라인 함수의 코드가 각 호출 지점마다 삽입됩니다.

그러므로 바이너리 크기(컴파일 후 생성된 실행 파일 또는 오브젝트 파일의 크기)가 증가하게 됩니다.

따라서, 실행 파일의 크기가 증가해 메모리 사용량과 저장 공간도 더 많이 사용하게 됩니다.

2. 캐시 미스로 성능 저하

CPU는 프로그램 실행할 때, 명령어 캐시에 자주 실행되는 코드 블록을 저장합니다.

하지만, 인라인 함수의 코드가 길다면, 캐시에 모두 저장할 수 없습니다.

그래서, CPU가 메모리에서 명령어를 다시 가져와야 하는 캐시 미스(Cache Miss)가 발생합니다.

인라인 함수 코드가 길 때, 캐시 미스 확률이 높아져서 오히려 실행 속도가 느려 성능이 저하될 수 있습니다.

 

주의점

 

1. 항상 인라인 함수로 적용되지 않음

inline 키워드를 사용해서 함수를 선언해도 컴파일러가 인라인 적용 여부를 최종 판단 및 결정합니다.

그래서, 함수가 너무 길면, 자동으로 인라인으로 처리하지 않을 가능성이 있습니다.

 

2. 재귀 함수 처리 불가능

재귀 함수는 자기 자신을 계속해서 호출하는 함수를 말합니다.

코드에서 재귀 함수가 몇 번 호출될지 미리 알 수 없습니다.

또한, 재귀 함수의 횟수를 알더라도 그 횟수만큼 복제하면, 코드 크기가 기하급수적으로 증가할 위험이 있습니다.

그래서, 인라인 처리가 불가능합니다.

 

3. 멤버 함수 인라인 처리

class Sport
{
public:
	// 멤버 함수의 구현부를 클래스 내부에서 정의
	int getGame() { return _game; }
    	void setGame(const int game) { _game = game; }

private:
	int _game = 0;
}

클래스 내부에서 정의된 멤버 함수는 자동으로 인라인 처리됩니다.

위 예시처럼 inline 키워드가 없더라도 클래스 내부에서 구현된 멤버 함수에 대해서는 컴파일러가 암묵적으로 인라인 처리합니다.

 

4. 가상 함수에 대한 인라인 적용

가상 함수는 기본적으로 자동 인라인이 되지 않습니다.

가상 함수에서 inline을 사용할 수 있는 경우는 해당 가상 함수가 자식 클래스에서 오버라이딩되지 않았을 때만 가능합니다.

즉, 자식 클래스에 오버라이딩된 가상 함수는 inline 키워드가 붙어도 인라인이 적용되지 않습니다.

 

가상 함수는 동적 오버라이딩으로 함수의 실행 타입이 런타임에서 결정됩니다.

하지만, 인라인 함수는 컴파일 과정의 컴파일 단계 또는 링크 단계에서 수행됩니다.

그렇기에 대부분의 가상 함수에 대해서는 인라인을 적용할 수 없습니다.

 

 


03. 마무리

이처럼 인라인 함수는 짧고 자주 호출되는 함수에는 사용하면 좋지만, 코드가 엄청 긴 함수에서는 사용하지 않는 것이 좋습니다.

항상 프로그램의 성능을 생각하면서 적절한 상황에서만 인라인 함수를 사용해야 합니다.

 

오늘은 인라인 함수의 특징과 주의점에 대해서 알아봤습니다.

다음에는 인라인 함수와 매크로 정의 지시어(#define)를 비교하면서 인라인 함수가 더 안전한 이유를 알아보겠습니다.

 


04. 연관 내용

  • [C++] inline 함수 - 2. 매크로 정의 지시어와 차이점
 

[C++] inline 함수 - 2. 매크로 정의 지시어와 차이점

목차01. Intro02. 인라인 함수 vs #define인라인 함수매크로 정의 지시어(#define)타입 검사 가능괄호 누락 방지영역디버깅 추적 가능03. 마무리04. 연관 내용01. Intro오늘은 인라인(inline) 함수와 매크로 정

epidemic-barcode.tistory.com

 

 


 

읽어주셔서 감사합니다.

틀린 내용 지적은 언제나 환영입니다!