[C++] 13 inline 함수

김진우·2025년 5월 27일

C++

목록 보기
13/16
post-thumbnail

inline 함수는 함수 호출문을 함수 본체로 대체(inline expansion) 하도록 컴파일러에 요청하는 함수이다.
즉, 함수를 호출하지 않고 호출 지점에 코드를 그대로 복사함으로써 함수 호출에 따른 오버헤드(스택 프레임, 점프 등)를 줄일 수 있다.

기존의 함수 호출은 다음과 같은 순서로 메모리 동작이 된다.

1. 함수 호출
 - 스택에 주소를 저장
 - 파라미터 값 저장
2. 호출자 스택 프레임 보존
3. 새 스택 프레임 생성 및 값 대입
4. 처리 완료 후 리턴 값 저장
5. 이전에 보존한 스택 프레임 복원
6. return 수행
   복귀 - Add 스택 프레임 삭제

요즘의 컴파일러는 inline 키워드를 강제로 받아들이지 않고 성능 이득이 없다면 inline화를 하지 않는다.

하지만, Unreal에서는 force inline이 매크로로 강제 되어있고, 사용하면 인라인을 강제할 수 있다.

#define FORCEINLINE __forceinline으로 정의되어 있다.

inline 함수의 목적

  1. 함수 호출 오버헤드 제거
    • 짧은 함수는 호출 비용이 상대적으로 크므로, 코드를 직접 넣는 것이 더 빠를 수 있다.
  2. 속도 향상
    • 컴파일러가 함수 코드를 직접 복사해서 넣으므로, 실행 속도가 빨라질 수 있다. (특히 루프 안에서 많이 호출되는 짧은 함수들).
  3. 매크로보다 안전
    • 매크로 함수처럼 코드 삽입 효과를 가지면서도, 타입 검사, 디버깅 등의 안전성이 보장됩니다.

inline 함수가 되기 위한 조건

  1. 정의가 헤더 파일 내에 있어야 한다.
    함수 정의가 분리된 소스 파일에 있다면 inline 불가

사용 예시

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

int sum = Add(3, 4);

컴파일러는 Add(3, 4)를 3+4로 치환해 사용할 수 있다.

Inline 함수 vs 매크로

항목inline 함수매크로 (#define)
타입 검사O (컴파일 시 타입 확인)X (단순한 텍스트 치환)
디버깅O (디버깅 정보 있음)X (디버깅 어려움)
이름 공간 충돌방지 가능 (namespace, class)전역으로 확장됨
코드 가독성높음 (표준 C++ 문법)낮음 (오동작 가능성)
복잡한 표현가능 (템플릿, 오버로드 등)불가능
부작용 처리안전 (인수 한 번만 평가)위험 (여러 번 평가됨)

언제 inline을 쓰고, 언제 매크로를 써야 할까?

상황추천 방식
단순 수식/로직inline 함수
조건부 컴파일매크로 (#ifdef, #define)
템플릿 함수 내 구현inline 함수 (필수는 아님)
코드 조각 삽입 (__FILE__, __LINE__)매크로 (컴파일러 매직 필요)
타입 안전 중요항상 inline 함수 우선

0개의 댓글