C++/C++ 일반

인라인(inline) 함수

ChaeSY 2018. 10. 12. 12:29


0. 개요 및 동작

인라인 함수란 '함수 호출 인라이닝' 작업을 하는 함수입니다. 

함수 호출 인라이닝은 대상 함수에 대한 호출을 실제 코드로 대체하는 것으로 매크로 함수(#define)의 치환 작업과 유사합니다. 


대부분의 빌드 환경에서 인라인은 컴파일 중에 수행됩니다. 

예외적으로 링크 도중에 인라인을 수행하는 빌드 환경이나, CLI에 기반한 닷넷 관리 환경등은 런타임에 진행하기도 합니다. 

하지만 대부분의 일반적인 C++ 프로그램에서 함수 인라인은 컴파일 타임에 진행됩니다.



1. 장점과 단점

장점

인라인 함수는 함수 호출 부분을 구현부로 대체하기 때문에, 함수 호출을 하지 않습니다. 

함수를 호출하지 않기 때문에 함수 호출 비용이 발생하지 않습니다. 


덧붙여, 함수에서 나오는 결과 값을 컴파일러가 알 수 있기 때문에 컴파일 단계에서 추가적인 최적화가 가능합니다. 

(인라인화 되지 않으면 함수의 결과 값을 컴파일러가 알 수 없으므로 최적화를 할 수 없습니다.)


단점

코드 비대화로 페이징 횟수가 늘어나고 명령어 캐시 적중률이 떨어질 가능성이 높아집니다.



2. 그 외 관련 정보

인라인화는 컴파일러 재량이다.

인라인 함수는 inline 키워드를 붙인다고 하여, 무조건 인라인화 되는 것이 아닙니다. 

inline 키워드를 붙이는 것은 컴파일러에게 요청하는 것으로, 실제 인라인화는 컴파일러의 재량에 달려있습니다.


inline 키워드를 사용하여도 인라인화 되지 않는 경우는 다음과 같습니다.

ㆍ 디버그 빌드로 컴파일 된 경우

ㆍ 다양한 형식의 예외처리를 사용한 경우

ㆍ 가변 인수 목록이 있는 경우

ㆍ 재귀 함수

ㆍ 가상 함수 (가상 함수의 직접 호출은 인라인화 할 수 있습니다.)

ㆍ 함수 포인터로 호출한 함수


라이브러리 설계에는 인라인 함수를 더욱 주의하여 사용해야 한다.

인라인 함수는 선언부에 의존되어 있으므로, 라이브러리 설계자가 함수 내부를 수정한다면 사용자 모두는 다시 컴파일 하여야 합니다.



인라인 함수는 ODR(one definition rule)을 무시한다.

추후 작성


매크로 함수와 인라인 함수의 차이점

매크로 함수는 단순 치환으로 일반적인 함수에서 검사하는 타입체크와 같은 것들을 수행하지 않습니다. 

또한, 매크로 함수는 요청하는 것이 아닌 무조건적인 치환입니다.




참고: Effective C++, 

       MSDN(https://msdn.microsoft.com/ko-kr/library/bw1hbe6y.aspx)