inline 함수는 함수 호출문을 함수 본체로 대체(inline expansion) 하도록 컴파일러에 요청하는 함수이다.
즉, 함수를 호출하지 않고 호출 지점에 코드를 그대로 복사함으로써 함수 호출에 따른 오버헤드(스택 프레임, 점프 등)를 줄일 수 있다.
기존의 함수 호출은 다음과 같은 순서로 메모리 동작이 된다.
1. 함수 호출
- 스택에 주소를 저장
- 파라미터 값 저장
2. 호출자 스택 프레임 보존
3. 새 스택 프레임 생성 및 값 대입
4. 처리 완료 후 리턴 값 저장
5. 이전에 보존한 스택 프레임 복원
6. return 수행
복귀 - Add 스택 프레임 삭제
요즘의 컴파일러는 inline 키워드를 강제로 받아들이지 않고 성능 이득이 없다면 inline화를 하지 않는다.
하지만, Unreal에서는 force inline이 매크로로 강제 되어있고, 사용하면 인라인을 강제할 수 있다.
#define FORCEINLINE __forceinline으로 정의되어 있다.
inline int Add(int a, int b) {
return a + b;
}
int sum = Add(3, 4);
컴파일러는 Add(3, 4)를 3+4로 치환해 사용할 수 있다.
| 항목 | inline 함수 | 매크로 (#define) |
|---|---|---|
| 타입 검사 | O (컴파일 시 타입 확인) | X (단순한 텍스트 치환) |
| 디버깅 | O (디버깅 정보 있음) | X (디버깅 어려움) |
| 이름 공간 충돌 | 방지 가능 (namespace, class) | 전역으로 확장됨 |
| 코드 가독성 | 높음 (표준 C++ 문법) | 낮음 (오동작 가능성) |
| 복잡한 표현 | 가능 (템플릿, 오버로드 등) | 불가능 |
| 부작용 처리 | 안전 (인수 한 번만 평가) | 위험 (여러 번 평가됨) |
inline을 쓰고, 언제 매크로를 써야 할까?| 상황 | 추천 방식 |
|---|---|
| 단순 수식/로직 | inline 함수 |
| 조건부 컴파일 | 매크로 (#ifdef, #define) |
| 템플릿 함수 내 구현 | inline 함수 (필수는 아님) |
코드 조각 삽입 (__FILE__, __LINE__) | 매크로 (컴파일러 매직 필요) |
| 타입 안전 중요 | 항상 inline 함수 우선 |