-
함수 본체를 직접 코드에 붙여서 호출 관련 오버헤드 비용을 줄일 수 있는 키워드이다.
하지만 컴파일러는 인라이닝을 단순한 제안의 일종으로 받아들인다.
밑에서 설명할 __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
'Programming > C/C++' 카테고리의 다른 글
전역(global)변수와 정적(static)변수 (4) 2015.06.24 Virtual Table (가상함수 테이블) (0) 2014.12.18 CreateThread & _beginthreadex (0) 2014.11.02 new operator, operator new, placement new (0) 2014.07.18 shared_ptr (0) 2014.06.20 댓글