인라인 함수는 컴파일러가 (하지만 의무는 아님) 함수 호출을 직접 함수 코드로 대체할 수 있는 함수입니다. 이를 위해 inline 키워드가 사용됩니다.
inline 키워드는 컴파일러에게 조언을 제공하지만 의무는 아닙니다: 함수가 너무 복잡한 경우 무시될 수 있습니다.제한 사항 및 위험:
예시:
inline int add(int a, int b) { return a + b; } struct X { int get() const { return value; } int value; }; // get()은 인라인으로 간주됩니다.
질문: inline 키워드가 모든 호출 지점에서 함수가 인라인으로 포함될 것이라는 보장을 합니까?
답변: 아닙니다. 컴파일러는 내부 휴리스틱에 따라 인라인 함수의 대입 여부를 스스로 결정합니다. inline은 단지 권장 사항입니다.
이야기
금융 시스템에서 수십 개의 큰 인라인 함수를 가진 자주 사용되는 로거가 작성되었습니다. 시스템이 성장함에 따라 바이너리 크기가 몇 배로 증가하여 링크 시간 증가와 서버의 캐시 효율성이 감소했습니다.
이야기
크로스 플랫폼 소프트웨어를 마이그레이션하는 동안 일부 컴파일러(MSVC 및 GCC 등)가 인라인을 다르게 처리하여 일부 함수는 인라인으로 전개되지 않고, 반대로 일부는 전개되어 플랫폼 간의 실행 속도와 애플리케이션 크기에서 재현하기 어려운 차이를 유발했습니다.
이야기
개발자는 인라인 함수를 헤더 파일에서만 선언했지만 구현을 별도의 cpp 파일로 이동했습니다. 이로 인해 링크 중에 multiple definition 또는 unresolved external 오류가 발생했으며, 인라인 함수는 헤더에 정의되어야 합니다.