__forceinline, __inline, inline 함수 조사

2015. 3. 29. 04:52프로그래밍/C/C++

728x90
728x90

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 함수의 치환은 컴파일러가 비용/이익 분석 결과 이점이 있는 경우에만 실행한다.

inline 확장으로 크기가 큰 코드의 잠재적 비용에서 함수 호출 오버헤드를 줄일 수 있다.


__forceinline 키워드는 비용/이익 분석을 무시하고 프로그래머의 판단에 의존한다.

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

코드는 커지고 선능 향상은 미미할 수 있다.

심지어 큰 실행 파일일 땐 페이징이 증가되는 등의 이유로 성능이 떨어질 수 있다.


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로 수식된 함수의 경우.

728x90
반응형

'프로그래밍 > C/C++' 카테고리의 다른 글

오버라이딩(Overriding)  (0) 2015.03.31
가변인자  (0) 2015.03.31
friend  (0) 2015.03.30
Stroustrup Empty class에 대한 내용 읽어보기  (1) 2015.03.25
[c++] main함수의 인자 argc, argv  (0) 2015.03.07
부동소수점과 예시  (4) 2015.03.06
C와 C++의 차이점  (0) 2015.02.23