-
인라인 함수 언제사용하지??@ 16. 1 ~ 17. 1/Effective C++ 2015. 12. 31. 23:09
인라인 함수
함수호출비용이 면제
인라인을 남발하면 안됨..인라인 함수로 인해 부풀려진 코드는 성능의 걸림돌이 되지 쉽다.
명령어 캐시 적중률이 떨어질 가능성도 높다..
하지만 함수의 본문이 매우짧다면 인라인 사용하면 효율이 훨씬더 좋다,,
인라인은 명시적으로 함수 앞에 inline을 붙이면 된다.
inline void f() { } 이런식으로..
그리고 대체적으로 헤더파일에 들어 있어야 하는게 맞다..이유는 대부분의 빌드 환경에서 인라인을 컴파일 도중에 수행하기 때문이다.
그런데 이것은 요청이지 명령이 아니다..즉, 컴파일러가 자신이 보기에 복잡한 함수는 절대로 인라인 확장의 대상에 넣지 않는다.(루프가 들어있다거나 재귀함수인 경우가 이런예다) 그리고 가상 함수 호출 같은것은 절대로 인라인 해주지 않는다.
사실 가상함수의 의미는 어떤 함수를 호출할지 결정하는 작업을 실행 중에 한다라는 뜻이고,
inline의 의미는 함수 호출 위치에 호출된 함수를 끼워 넣는 작업을 프로그램 실행 전에 한다라는 뜻이니 ..가상함수가 인라인 안되는건 당연하다.
또 완벽한 인라인 조건을 갖췄는데도 컴파일러가 인라인 함수의 본문에 대해 코드를 만드는 경우가 있다.
예를들어 어떤 인라인 함수의 주소를 취하는 코드가 있으면 컴파일러는 이 코드를 위해 아웃라인 함수 본문을 만들 수밖에 없을 것이다. 있지도 않은 함수에 대해 어떻게 포인터를 가지고 오겠나?
게다가 인라인 함수로 선언된 함수를 함수 포인터를 통해 호출하는 경우도 대게 인라인되지 않는다.
inline void f() { } //이건 확실히 인라인이라고 가정하자
void (*pf)() = f; //함수포인터
f(); //인라인됨
pf(); //인라인 안됨..함수포인터를 통해서 호출하니까..
그리고 생성자, 소멸자를 인라인함수로 설정하는짓은 하지말자..그 안에서는 무수히 많은 일들이 일어난다..생성자는 상속시에는..기본부터...각종 멤버들.....등등..너무많아서 어차피 인라인자체가 안됨..소멸자도 마찬가지....
인라인 함수 하는법
1. 아무것도 인라인 하지 않는다.
2. 꼭 해야겠다면 get set함수 위주의 간단한 리턴문만 한다.
'@ 16. 1 ~ 17. 1 > Effective C++' 카테고리의 다른 글
소멸자에서 예외를 발생? (1) 2015.12.05 기본 대입연산자 생성조건? (0) 2015.12.04 클래스 생성자는 초기화가 아니다. 정적(static)객체의 종류와 방법 (0) 2015.12.04 const 멤버 함수의 종류, const 함수내에서 수정가능한 경우 (0) 2015.12.04 #define cosnt 상수변수로 바꾸기! operator[], const static, 클래스내 const, define 매크로 (0) 2015.12.03