본문 바로가기

코드^학습/메모한 지식

inline 함수 by MSDN

인라인 함수에 대해 자꾸 잊어버리는 문제때문에 간략하게 적어두겠습니다.


인라인 함수는 매크로함수(간단한 예로 #define third(x) x*x*x )와 같이 치환하여 처리해주는 함수입니다.


매크로함수는 치환함수로서 호출하면 바로 치환하여 처리를 수행합니다.

(보통 함수를 호출하면 호출한 함수로 분기가 넘어가 수행하고 함수가 종료되면 원래 코드로 돌아와서 마저 수행을 하죠.)


반면 인라인함수는 치환함수의 성격도 보통 함수의 성격도 가지고 있습니다.(반반무많이?)

개발자가 인라인 함수라고 정의를 해두면 컴파일러가 비용을 계산하여 매크로함수로 둘지, 일반함수로 둘지 결정합니다.


MSDN의 정확하지만 어려운 표현을 빌려보겠습니다. (좀 축약했습니다.)

inline / __inline 으로 명시한 함수는 함수가 호출되는 모든위치에 함수 본문의 복사본을 삽입하도록 컴파일러에게 지시합니다.

이러한 삽입은 컴파일러에서 비용/이익 분석 결과 수익성이 있을 경우에만 발생합니다.

(키워드 사용은 컴파일러에게 제안으로 인식됩니다. 즉, 사용이 곧 인라인함수로 처리된다는 보장은 없습니다.)

인라인을 사용하면 큰 코드 크기를 줄이는 코드 최적화가 적용되어 함수 호출 오버헤드를 줄일 수 있습니다.


__forceinline 키워드는 비용/이익 분석을 개발자의 판단에 맡깁니다. 이 키워드를 주의해서 사용하지 않는다면 코드가 더 켜져 성능에서 손실을 볼 수 있습니다.


inline은 C++에서만 사용할 수 있고, __inline , __forceinline은 C에서도 사용할 수 있습니다.

(이전버전과의 호환을 위해 _inline은 __inline과 동일 키워드로 취급합니다.)


이 키워드를 명시하면 컴파일러에게 인라인 확장이 더 적함합을 컴파일러에게 알리고, 

컴파일러는 해당함수가 재귀이거나 다른 위치에서 포인터를 통해 참조되는 함수일 경우

함수의 별도 인스턴스를 만들고 인라인으로 삽입하는 대신 표준 호출 링크를 만들 수 있습니다.


다시봐도 뭔소린가 했는데 차근차근 읽으면 이해할 수 있습니다.

또 까먹겠지만 다시 와서 보면 되겠죠.