MSDN 해석(VS2013)


1. __inline, __forceinline, inline 개요

https://msdn.microsoft.com/ko-kr/library/z8y1yy88.aspx


정의

inline 및 __inline 지정자는 함수가 호출되는 모든 위치에 함수 본문을 치환하도록 컴파일러에게 지시하는 것이다.


inline function_declarator;   
__inline function_declarator;   // Microsoft Specific
__forceinline function_declarator;   // Microsoft Specific


설명

inline은 컴파일러의 비용 대 효과 분석을 통해 이익이 있다고 판단할 때만 발생한다. 함수를 호출하는 오버헤드를 경감할 수 있지만, 코드 사이즈 크기가 커지는 잠재적인 코스트가 존재한다.


__forceinline 키워드를 사용하면, 컴파일러가 행하는 비용/이익 분석 대신에 프로그래머의 판단에 의존한다.

__forceinline을 사용할 때 특별히 주의해야 하는데, 이는 무분별하게 사용할 경우

코드는 커지고 퍼포먼스(성능) 향상은 미미할 수 있으며 경우에 따라서는(inline한 코드가 큰 경우) 페이징이 증가되는 등의 이유로 성능이 떨어질 수 있다.


inline 키워드를 사용해도 반드시 함수가 인라인되는 것은 아니다.

__forceinline 키워드를 사용하는 경우에도 특정 함수를 강제로 인라인 할 수 없는 경우가 있다.

/clr 옵션으로 컴파일을 하는 경우, 함수에 적용하는 보안 속성이 있다면 이 함수는 인라인하지 않는다.


inline 키워드는 C++에서만 사용할 수 있다. __inline 및 __forceinline 키워드는 C/C++에서 모두 사용할 수 있다.

이전 버전과 호환성을 위해 _inline과 __inline은 동의어로 사용된다.


2. __forceinline 키워드로 인라인 할 수 없는 경우

- 함수 또는 호출대상이 /Ob0(디버그 빌드 기본값) 컴파일 옵션으로 컴파일 된 경우

- 함수 또는 호출대상이 서로 다른 형식의 예외 처리를 사용하는 경우

(예 : 한쪽은 C++ 예외처리, 다른쪽은 구조화된 예외처리를 사용하는 경우)

- 함수가 가변인수 리스트를 가지고 있는 경우

- 함수가 /Og, /Ox, /O1 또는 /O2를 쓰지 않고 인라인 어셈블리를 사용하는 경우

- 함수가 재귀적이고 #pragma inline_recursion(on)을 하지 않은 경우. 

Pragma 재귀함수는 총 16번의 깊이로 인라인한다. 깊이를 조절하려면 #pragma inline_depth 를 사용하면 된다.

- 함수가 virtual이고 가상적으로 호출되는 경우, 가상함수의 직접호출은 인라인 가능.

- 프로그램에서 해당 함수의 주소를 사용하는 함수 포인터로 호출될 경우. 

주소가 있었던 해당 함수에 대한 직접 호출의 경우 인라인 가능.

- naked_declspec로 수식된 함수의 경우.




Posted by GENESIS8

댓글을 달아 주세요