항목 30 : 인라인 함수는 미주알고주알 따져서 이해해 두자
인라인 함수를 사용하면 컴파일러가 함수 본문에 대해 문맥별 최적화를 걸기가 용이해집니다. 실제로 대부분의 컴파일러는 '아웃라인' 함수 호출에 대해 이런 최적화를 적용하지 않습니다.
인라인 함수 사용시 코드의 크기가 커질수 있으며 이는 성능의 걸림돌이 될 수도 있습니다.
하지만 본문 길이가 굉장히 짧은 인라인 함수를 사용할 경우 함수 본문에 대해 만들어지는 코드의 크기가 함수 호출문에 대해 만들어지는 코드보다 작아질 수도 있습니다.
인라인 함수는 대체적으로 헤더 파일에 들어 있어야 하는게 맞습니다. 대부분의 빌드 환경에서 인라인을 컴파일 도중에 수행하기 때문입니다. 인라인 함수 호출을 그 함수의 본문으로 바꿔치기하려면 컴파일러가 그 함수가 어떤 형태인지 알고 있어야 합니다.
템플릿 역시, 대체적으로 헤더 파일에 들어 있어야 맞습니다. 템플릿이 사용되는 부분에서 해당 템플릿을 인스턴스로 만들려면 그것이 어떻게 생겼는지를 컴파일러가 알아야 하기 때문입니다.
inline은 컴파일러 선에서 무시할 수 있는 요청이라는 사실을 기억해 두어야 합니다. 대부분의 컴파일러의 경우, 아무리 인라인 함수로 선언되어 있어도 자신이 보기에 복잡한 함수는 절대로 인라인 확장의 대상에 넣지 않는데다가(루프가 들어 있다거나 재귀 함수인 경우가 이런 예입니다), 정말 간단한 함수라 할지라도 가상 함수 호출 같은 것은 절대로 인라인해 주지 않습니다.
정리를 해보면, 인라인 함수는 사용하는것에 따라 성능을 저하시킬수도 향상시킬수도 있습니다.
꼭 인라인 해야할 함수 혹은 정말 단순함 함수에 한해서만 인라인 함수로 선언하십시오.
인라인을 주의해서 사용하는 버릇을 들여서, 디버깅하고 싶은 부분에서 여러분의 디버거를 제대로 쓸 수 있도록 만들고, 정말 필요한 위치에 인라인 함수를 놓도록 하십시오. 수동 최적화인 셈입니다.
꼭 잊지 말아야 할 것!
1. 함수 인라인은 작고, 자주 호출되는 함수에 대해서만 하는 것으로 묶어둡시다. 이렇게 하면 디버깅 및 라이브러리의 바이너리 업그레이드가 용이해지고, 자칫 생길 수 잇는 코드 부풀림 현상이 최소화되며, 프로그램의 속력이 더 빨라질 수 있는 여지가 최고로 많아집니다.
2. 함수 템플릿이 대개 헤더 파일에 들어간다는 일반적인 부분만 생각해서 이들을 inline으로 선언하면 안 됩니다.
'언어 > C++' 카테고리의 다른 글
[Effective C++] public 상속 모형은 반드시 "is-a(...는 ...의 일종이다)"를 따르도록 만들자 (0) | 2020.02.01 |
---|---|
[Effective C++] 파일 사이의 컴파일 의존성을 최대로 줄이자 (0) | 2020.01.31 |
[Effective C++] 예외 안전성이 확보되는 그날 위해 싸우고 또 싸우자! (0) | 2020.01.29 |
[Effective C++] 내부에서 사용하는 객체에 대한 '핸들'을 반환하는 코드는 되도록 피하자 (0) | 2020.01.28 |
[Effective C++] 캐스팅은 절약, 또 절약! 잊지 말자 (0) | 2020.01.27 |