inline은 컴파일러에게 함수 호출을 해당 본문(코드 삽입)으로 대체하라는 힌트입니다. 이는 실행 속도를 높일 수 있지만(호출 오버헤드가 없음) 바이너리 크기가 증가합니다.
구문:
inline int square(int x) { return x * x; }
컴파일러는 inline을 무시할 권리가 있습니다. 여러 파일에서 함수의 가시성과 구현을 동시에 사용하려면:
// header.h inline int min(int a, int b) { return a < b ? a : b; }
함수의 전체 본문은 inline 함수가 호출되는 각 파일에서 접근 가능해야 하므로, 일반적인 방법은 함수를 헤더 파일에서 정의하는 것입니다.
만약 inline 함수를 단일 .c 파일에만 선언하고 정의한다면, 다른 모듈에서는 이를 사용할 수 없으며, 링킹 오류가 발생할 것입니다(정의되지 않은 참조).
헤더 파일에 있는 이런 선언 사이의 차이는 무엇입니까?
inline int foo(int x) { return x + 1; } static inline int bar(int x) { return x + 1; }
inline int foo(...)는 함수가 여러 개의 약한 정의를 가질 수 있도록 합니다(하나의 정의 규칙). 여러 .c 파일에서 동일한 헤더를 포함 할 경우, 링커는 다중 정의 오류를 발생시킬 수 있습니다.static inline은 각 모듈에 대해 함수를 내부화하여, 각 연결 지점이 자신의 복사본을 갖도록 하며, 링킹 단계에서 문제가 발생하지 않습니다. 이는 헤더에서 inline 함수에 가장 안전합니다.이야기
수학 함수 라이브러리에서 여러 inline 도우미를 .c 파일에서 정의했습니다. 다른 모듈에서 이를 사용하려고 할 때 링킹 오류가 발생했습니다. 그 정의가 한 객체 파일에서만 보였기 때문입니다.
이야기
.inline 함수를 .c 파일에서 헤더로 옮긴 후 프로젝트가 링킹 단계에서 실패했습니다. 링커는 동일한 함수의 다중 정의에 대해 불평했습니다. 헤더 파일에서 static inline으로 대체하여 문제를 해결했습니다.
이야기
내부 알고리즘 최적화에 대해 "중요한" 함수에 inline을 사용하여 속도가 향상되기를 기대했습니다. 그러나 컴파일러는 힌트를 무시했고, 프로파일러는 호출 비용이 줄어들지 않았음을 보여주었습니다. 이 문제는 컴파일러 최적화 옵션에 대한 수동 분석 후에만 해결되었습니다.