대체적으로 Compiler 최적화는 함수 호출이 없는 Code가 연속적으로 이어지는 구간에 적용되도록 설계되었기 때문에 인라인 함수를 사용하면 Compiler가 함수 본문에 대해 문백별(context-specific) 최적화를 걸기가 용이해진다.
inline은 Compiler에 대해 '요청'을 하는 것이지, '명령'이 아니다. 요청은 inline을 붙여서 명시적으로도 할 수 있지만, 암시적으로도 가능하다. Class 정의 안에 함수를 바로 정의해 넣으면 Compiler는 그 함수를 인라인 함수 후보로 찍어둔다.
복잡한 함수는 절대로 인라인 함수화되지 않는다. (Loop가 있거나 재귀함수) 가상함수도 절대로 인라인해주지 않는다. 그리고 인라인 함수의 주소(포인터)를 취하는 코드가 있으면, Compiler는 그 코드를 아웃라인 함수로 만들 수 밖에 없다.
라이브러리를 설계하는 사람들은 함수를 inline으로 선언할 때 그 영향력에 대해 많은 고민을 해야 한다. 왜냐면 인라인 함수에 대해서는 라이브러리 차원에서의 업그레이드를 제공할 수 없다. 해당 함수가 수정 되었을 경우 각가 소스를 다시 컴파일 해야 한다. inline이 아닌 일반 함수를 고쳤을 경우에는 링크만 다시 해주면 된다.
* 함수 템플릿이 대개 헤더 파일에 들어간다는 일반적인 부분만 생각해서 이들을 inline으로 선언하면 안 됩니다.
댓글 없음:
댓글 쓰기