**C++**에서 inline
키워드는 컴파일러에게 함수 호출을 함수의 실제 코드로 치환(인라인 전개)할 것을 제안하는 키워드입니다. 함수 호출의 오버헤드를 줄이고 성능을 향상시키기 위해 사용됩니다.
// 일반 함수
int add(int a, int b) {
return a + b;
}
// 인라인 함수
inline int addInline(int a, int b) {
return a + b;
}
int main() {
int result1 = add(5, 3); // 함수 호출 오버헤드 발생
int result2 = addInline(5, 3); // 컴파일러가 인라인으로 치환할 수 있음
return 0;
}
// addInline(5, 3) 호출이 다음과 같이 치환될 수 있음:
int main() {
int result1 = add(5, 3); // 여전히 함수 호출
int result2 = 5 + 3; // 인라인으로 치환됨
return 0;
}
// 선언과 정의를 분리한 경우
inline int multiply(int a, int b); // 선언
inline int multiply(int a, int b) { // 정의
return a * b;
}
// 또는 선언과 동시에 정의
inline int divide(int a, int b) {
return a / b;
}
class Calculator {
public:
// 클래스 내부에서 정의된 함수는 자동으로 inline으로 간주됨
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b); // 선언만
};
// 클래스 외부에서 정의하면서 inline 지정
inline int Calculator::subtract(int a, int b) {
return a - b;
}
// 성능 향상 예시
inline int square(int x) {
return x * x;
}
void performCalculations() {
for (int i = 0; i < 1000000; ++i) {
int result = square(i); // 함수 호출 오버헤드 제거
// 실제로는 int result = i * i; 로 치환됨
}
}
// 코드 크기 증가 예시
inline void complexFunction() {
// 복잡한 로직 (50줄의 코드)
for (int i = 0; i < 100; ++i) {
// 많은 계산들...
}
}
void callingFunction() {
complexFunction(); // 이 호출마다 50줄의 코드가 복사됨
complexFunction(); // 또 50줄 복사
complexFunction(); // 또 50줄 복사
// 결과: 코드 크기가 급격히 증가
}
// 너무 복잡한 함수
inline void tooComplex() {
for (int i = 0; i < 1000; ++i) {
// 복잡한 계산들
std::cout << "Complex operation " << i << std::endl;
}
}
// 재귀 함수
inline int factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n - 1); // 재귀 호출
}
// 가상 함수
class Base {
public:
inline virtual void func() { // 가상 함수는 inline이 어려움
std::cout << "Base function" << std::endl;
}
};