호출 비용(분기·레지스터 저장·스택 조작)을 없앤다.
static inline uint32_t clamp(uint32_t v, uint32_t hi) { return v > hi ? hi : v; }
왜 빨라지나
- 분기와 스택 조작이 사라진다
- 상수 전파가 열린다 — 인자가 상수면 함수 내부 분기가 통째로 사라지기도 한다
- 파이프라인 흐름이 끊기지 않는다
작은 함수일수록 이득이 크고, 큰 함수는 코드 크기만 늘고 캐시·플래시 접근이 나빠져 손해다.
힌트일 뿐 명령이 아니다
inline 키워드는 권고이고, 실제 판단은 컴파일러가 한다.
강제하려면 __attribute__((always_inline)), 막으려면 noinline 을 쓴다.
디버깅과의 상충
인라인된 함수는 브레이크포인트를 걸 수 없고 스택 트레이스에도 안 나온다.
그래서 디버그 빌드는 -O0/-Og, 릴리스는 -O2/-Os 로 나누되,
릴리스 구성으로 최종 검증하는 것이 원칙이다. 최적화 수준이 바뀌면 타이밍도 바뀐다.