함수 호출을 함수의 실제코드로 대체하는 것
함수 호출 과정을 거치지 않고, 함수 정의 자체를 그대로 스크립트에 복사해서 실행한다.
int add(int a, int b)
{
return a + b;
}
int main()
{
int result = add(3, 5); // 함수 호출
return 0;
}
함수 호출 오버헤드는 함수가 실제 작업을 수행하느 시간 외에 매개변수 전달, 반환 주소 저장, 스택 프레임 생성/해제 등으로 발생하는 추가적인 시간 및 메모리 비용이다.
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; }
- 작고 자주 호출되는 함수
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; } };