static inline 함수

jy·2025년 3월 17일

static 으로 정의된 함수는 같은 소스 파일에서만 사용 가능하다.
static 함수는 다른 외부 파일에서 사용 할 수 없다. (함수 포인터를 사용하여 호출 하는 경우 제외)

inline 으로 정의 되면 함수는 함수에 대한 호출을 생성하는 것이 아니라, 컴파일러에게 호출이 발생하는 그 위치에 코드가 생성함.

static + inline 으로 정의 된 함수는 현재 작성된 파일에서만 사용 가능하고, 외부에서는 호출 할 수 없고, 호출 된 그 시점에서 코드가 inline으로 생성된다.

일반적으로 공개 API가 아닌 매우 간단하고 자주 호출 되는 내부 helper 함수에서 사용한다.

✅ inline이 효율적인 경우 (최적화 효과 O)
1️⃣ 짧고 단순한 함수

예: getter, setter, 간단한 수학 연산 (min(), max(), swap() 등)
이런 함수는 호출될 때마다 inline 확장을 하면 성능이 향상됨!

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

int x = add(5, 10); // → 컴파일 후: int x = (5 + 10);
2️⃣ 매우 자주 호출되는 함수

루프 안에서 반복적으로 호출되는 작은 함수는 함수 호출 오버헤드를 줄이는 효과가 큼.

for (int i = 0; i < 1000000; i++) {
sum += add(i, i + 1); // 호출 오버헤드가 줄어듦
}

❌ inline이 비효율적인 경우 (주의할 점)
1️⃣ 함수가 너무 크면 코드 크기가 증가함 (Code Bloat)

inline 함수는 호출될 때마다 그 자리에 코드가 삽입되므로, 함수가 크면 코드 크기 증가 → 캐시 효율이 떨어질 수 있음.

static inline int large_function(int x) {
int result = 0;
for (int i = 0; i < 1000; i++) {
result += x * i;
}
return result;
}
이 함수가 여러 번 호출되면, inline 확장 때문에 코드 크기가 급격히 증가할 수 있음.
해결책: 크고 복잡한 함수는 그냥 일반 함수로 호출하는 게 더 효율적!
2️⃣ 재귀 함수는 inline이 불가능

inline 함수는 호출 위치에 코드를 삽입하는 방식이므로, 재귀 함수는 불가능함.

static inline int factorial(int n) { // ❌ 컴파일러가 인라인 확장을 안 함
if (n == 0) return 1;
return n * factorial(n - 1);
}
컴파일러는 재귀 호출을 inline으로 변환할 수 없음 → 그냥 일반 함수 호출됨.
3️⃣ 컴파일러가 inline을 강제하지 않음

inline 키워드는 컴파일러에게 "이 함수는 인라인 확장하면 좋겠어"라는 힌트를 주는 것일 뿐, 강제 사항이 아님.
컴파일러는 함수가 너무 크거나 최적화에 적합하지 않다고 판단하면 inline을 무시할 수도 있음.
GCC와 Clang에서는 -Winline 옵션을 사용하면, 인라인 확장이 안 된 경우 경고를 받을 수 있음.

출처: https://www.quora.com/Whats-the-difference-between-static-and-static-inline-function-in-C

0개의 댓글