xxx123 2014. 12. 17. 22:31


함수 본체를 직접 코드에 붙여서 호출 관련 오버헤드 비용을 줄일 수 있는 키워드이다.

하지만 컴파일러는 인라이닝을 단순한 제안의 일종으로 받아들인다.

밑에서 설명할 __forceinline도 상황에 따라 받아들여지지 않을 수 있는것이다.




1. 키워드


inline 과 _inline과 __inline은 모두 같은 키워드이다.

inline은 C++에서만 지원하며 __inline은 C, C++ 모두 지원한다.

컴파일러가 자동으로 비용/효율을 분석해서 이득이 있는 경우에만 인라이닝을 한다.


__forceinline은 컴파일러의 비용/효율 분석 대신 프로그래머의 판단을 우선시 한다.

즐, 컴파일러의 판단 없이 무조건 inline화 하라는 강요식 키워드이다.






2. 함수가 inline되지 않는 상황


다음의 경우는 __forceinline을 사용해도 인라인 되지 않는 상황이다.



 가상 함수이고 이것을 부모 포인터 형식으로 호출하는 경우

       - 동적으로 호출되기 때문에 컴파일 단계에서 무엇인지 알수 없다.

       - 단 자식이 자식 본연의 타입으로 호출하는 가상함수(virtual이 붙은 함수)는 인라이닝이 가능하다.



② 재귀함수의 경우

       - 함수가 얼마나 깊은 Depth의 재귀 호출을 할지 모르고, 안다고 하더라도 코드의 크기가 커지므로 안하는것이 낫다.

       - #prgma inline_recursion(on)이 되어 있는 경우에 한해 16depth까지 인라이닝이 된다고는 하지만 코드의 크기때문에               인라인화 하지 않는게 좋다.



③ 가변인자 목록을 가진 함수

        - 몇 개의 파라미터를 가질 지 컴파일러가 알수 없기 때문에 인라이닝 실패.



④ 함수 포인터를 통해 함수를 호출하는 경우



⑤ 함수와 함수호출자가 서로 다른 예외처리를 하는 경우.

       - 예를 들면 , 함수는 C++ exception handling을 하고, 호출자는 SEH를 사용하는 경우. 



만약 __forceinline으로 선언된 함수를 인라인하지 못할 경우 Level1경고(4714)를 던진다.





[참고]

http://msdn.microsoft.com/ko-kr/library/vstudio/z8y1yy88(v=vs.110).aspx

http://sweeper.egloos.com/3015420