[C/C++] 인라인(Inline)

할랑말랑·2026년 3월 6일

C/C++

목록 보기
6/45

인라인

함수 호출을 함수의 실제코드로 대체하는 것
함수 호출 과정을 거치지 않고, 함수 정의 자체를 그대로 스크립트에 복사해서 실행한다.

1. 함수 호출 시 일어나는일

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

int main()
{
    int result = add(3, 5); // 함수 호출
    return 0;
}
  1. 함수 호출 준비(매개변수를 스택에 푸시)
  2. 현재 실행 위치 저장
  3. 함수로 점프
  4. 함수 실행
  5. 반환값 저장
  6. 원래 위치로 복귀
  7. 스택 정리

이과정을 함수 호출 오버헤드(Function Call Overhead)라고 한다.

함수 호출 오버헤드는 함수가 실제 작업을 수행하느 시간 외에 매개변수 전달, 반환 주소 저장, 스택 프레임 생성/해제 등으로 발생하는 추가적인 시간 및 메모리 비용이다.

2. 인라인 함수

inline 키워드 사용

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

int main()
{
    int x = add(3, 5);   // 컴파일러가 3 + 5로 대체
    int y = add(10, 20); // 10 + 20으로 대체
    return 0;
}

컴파일러의 인라인 판단

컴파일러에게 inline 키워드는 힌트 일뿐 항상 inlune 하는 것을 보장 하지않는다.
비용(Cost) 분석을 통해 inline이 손해라고 판단하면 코드에서 inline을 붙여도 포기한다.

최신 컴파일러의 경우는 최적화 기능이 잘 되어 있기에 inline이 붙어 있지 않더라도 inline 하는게 이득이라고 판단하면 알아서 inline 처리를한다.

클래스 에서 정의한 함수

class Calculator
{
public:
    // 클래스 내부에서 정의 - 암묵적으로 inline
    int add(int a, int b)
    {
        return a + b;
    }

    int multiply(int a, int b); // 선언만
};

// 클래스 외부 정의 - inline 명시 필요
inline int Calculator::multiply(int a, int b)
{
    return a * b;
}

3. 인라인이 적합한경우/부적합한 경우

적합한 경우

  • 작고 자주 호출되는 함수
inline int max(int a, int b)
{
    return (a > b) ? a : b;
}

inline int min(int a, int b)
{
    return (a < b) ? a : b;
}

inline int abs(int x)
{
    return (x < 0) ? -x : x;
}
  • getter/setter/간단한 함수
#include <iostream>

using namespace std;

class Person
{
private:
    string name;
    int age;
public:
    string getName() const;
    void setName(const string& n);
    int getAge() const;
    void setAge(int a);
};

inline string Person::getName() const
{
    return this->name;
}

inline void Person::setName(const string& n)
{
    this->name = n;
}

inline int Person::getAge() const
{
    return this->age;
}

inline void Person::setAge(int a)
{
    this->age = a;
}

부적합한 경우

  • 크고 복작한 함수
// 인라인 부적합
inline void complexFunction()
{
    // 100줄의 복잡한 로직
    for(int i = 0; i < 1000; i++)
    {
        // 복잡한 계산
        // 많은 조건문
        // 중첩된 루프
    }
}
  • 재귀 함수
// 인라인 불가능
inline int factorial(int n)
{
    if(n <= 1)
    {
        return 1;
    }

    return n * factorial(n - 1); // 재귀 호출
}
  • 가상 함수
class Base
{
public:
    // 가상 함수는 인라인 불가 (런타임에 결정)
    virtual void process()
    {
        cout << "Base" << endl;
    }
};

장점

  • 성능 향상
  • 컴파일러 최적화 기회 증가

단점

  • 코드 크기 증가
  • 컴파일 시간 증가
  • 디버깅 어려움

0개의 댓글