책 정리/Effective C++ 3rd

항목 30. 인라인 함수는 미주알고주알 따져서 이해해 두자

ocean20 2020. 3. 6. 12:15

1. 인라인함수 : 말그대로 본문의 코드를 바꿔치기 하는 함수. 호출비용 X, 코드 비대화 가능성 있음

    (짧게 사용시, 대체되는 코드 크기보다 호출 비용이 작으면 효율적임)

2. 아웃라인함수 : 일반함수 호출

 

인라인함수는 명시적, 암시적으로 사용할 있다.

class Person{
public:
  int age() const { return theAge;} // 암시적
private:
  int theAge;
};
// 참고 : 프렌드 함수도 클래스 내부에서 정의가능함..

(명시적 : inline이라고 명시한다.)

 

3. 인라인함수를 명시적으로 사용하더라도 컴파일러가 보기에 복잡하면, 인라인 대상으로 삼지 않는다.

예를 들면, (1) 재귀 (2) 루프 (3) virtual 있는경우, (4) 함수의 주소를 취하는 코드, (5) 함수포인터 통해 호출하는경우

(virtual 실행중에 어떤 함수를 실행할지 결정, inline 실행전에 함수를 끼워넣는작업이므로 모순)

다행히 실패시에도, 컴파일러는 경고창을 띄어준다.

 

4. 생성자 소멸자도 인라인화 하면안된다.

why ?

Base(멤버변수로 a,b,c 가지고있음) 상속받는 Derived 클래스((멤버변수로 d,e 가지고있음) 있다고 생각해보자.

Derived 생성자 호출시 : Base 생성자호출, d,e 생성자호출

Base 생성자 호출시 : a,b,c 생성자 호출

소멸자도 마찬가지다.

 

만약 Base 생성자가 인라인화 되면.. Dervied에도 생성자가 끼어드니..Derived 가지는 a,b,c,d,e 멤버에 대한 생성자이다.

 

이와같은 결과를 보니, 생성자를 인라인시 목적코드의 크기가 비대화된다. 따라서 생성자/소멸자는 인라인화 해선 안된다.

 

이것만은 잊지 말자!

1. 인라인함수는 작고, 자주 호출되는 함수만 적용하자

2. 함수템플릿이 헤더에 들어간다는 생각으로 inline으로 선언하면 안된다.