2015. 3. 29. 04:52ㆍ프로그래밍/C/C++
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로 수식된 함수의 경우.
'프로그래밍 > 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 |