본문 바로가기
기술자료/C C++

[賢彬][C++] 인라인(inline) 함수

by 알 수 없는 사용자 2009. 8. 4.
728x90
반응형
1. 일반 함수의 수행
 프로그램이 함수 호출 명령에 도달하면, 그 프로그램은 다음의 ①-⑥의 흐름을 갖는다.

① 함수 호출 명령 다음의 명령 주소를 메모리에 저장
② 스택에 전달인자를 복사
③ 해당 함수의 시작의 메모리 위치로 점프
④ 함수 수행
⑤ 함수 리턴 값을 레지스터에 저장
⑥ ①에서 저장해둔 주소의 명령으로 복귀


2. 인라인 함수
 인라인 함수는 프로그램의 코드들 가운데 컴파일된 함수 코드가 삽입된다. 이는 컴파일러에 의해 해당 인라인 함수가 함수 코드로 대체됨을 뜻한다. 이렇듯 인라인 함수를 사용하면, 프로그램은 해당 코드를 수행하기 위해 위의 일반 함수 수행처럼 메모리에 있는 함수의 주소를 찾아 점프할 필요가 없어지게 되어, 일반 함수보다 약간이나마 빠른 수행 속도를 갖을 수 있다. 그러나 만약 크기가 큰 코드를 가진 함수를 인라인 함수로 사용하고, 10번을 호출게 된다면, 해당 프로그램 코드 사이에 10개의 복사본을 갖게 됨으로써, 메모리 사용면에서 좋지 않을 수 있다. 또한 함수 수행의 속도에서도 일반 함수 크기가 작다면, 함수 수행을 위해 점프하고, 돌아오는 시간이 적으므로 속도로 얻을 수 있는 이익이 작을 수 있다. 그러므로 인라인 함수 사용 시에는 다음과 같은 특징을 꼭 기억하고 있어야 한다.

짧은 함수를 인라인 함수로 사용해야 한다.
함수 호출 비용을 절약한다.
짧은 인라인 함수는 함수 호출문에 대해 만들어지는 코드보다 목적 코드가 작아질 수 있다.
 캐시 적중율이 높아진다.

코드 길이가 긴 인라인 함수는 사용하지 말자!
인라인 함수를 남용하게 되면, 컴파일 시에 코드 대체로 인한 목적 코드의 크기가 증가할 수 있다.

③ 가상 함수를 인라인 함수로 만들지 말자!
가상 함수는 컴파일 시가 아닌, 프로그램 수행시 결정되므로 컴파일 시에 코드 대체되는 인라인 함수로는 사용될 수 없다.


3. 인라인과 매크로
간단한 처리를 위해 사용되어온 C의 잔재인 매크로들은 문제점을 안고 있으므로 인라인 함수로 고쳐 사용한다.
다음은 숫자를 제곱하는 매크로 함수이다.

#define SQUARE(X) (X*X)

위의 매크로 함수는 X를 전달인자로 보지 않고, 전달인자에 대한 심벌 레이블처럼 행동하게 하여 문자 대치에 의해 작동되어 다음의 문제점을 유발시킨다.

a = SQUARE(4.5+7.5);
 SQUARE 매크로가 호출되게 되면 다음과 같이 실행된다.
 4.5 + 7.5 * 7.5 + 4.5
 이는 연산자 우선순위에 의해(*은 + 보다 우선순위가 높다) 전혀 다른 결과를 얻게 된다.

b = SQUARE(a++);
 a++ * a++
 SQUARE 매크로가 호출되어 단순 문자 대치로 작동되어 위와 같은 결과를 초래한다. 그러므로 가급적 위와 같은 매크로는 사용을 지양하고, 다음과 같이 인라인 함수를 사용하도록 한다.
// Calculator.h
class CCalculator { ... public:     double CalcSquare(const double& dblVaule); }; inline double CCalculator::CalcSquare(const double& dblVaule) {    return (dblVaule*dblVaule); }

[예제 1] 명시적 inline 함수 (개인적으로 선호)


4. 인라인 사용 예
(1) 정의

inline 한정자를 사용하여 함수를 선언한다.
inline 함수의 정의는 그것을 호출하는 어떠한 함수보다도 앞에 있어야 한다.

(2) 구현
위의 CCalcuator 클래스 처럼 inline 한정자를 주어 명시적으로 인라인 함수를 구현할 수 있다. 그러나 암시적으로 다음과 같이 설정해도 컴파일러는 이를 인라인 함수로 처리한다.

// Calculator.h
class CCalculator
{
...

public:
    double CalcSquare(const double& dblVaule) { return (dblVaule*dblVaule); }
};

[예제 2] 암시적 inline 함수


(3) 사용
위의 [예제 1]과 [예제 2] 방법 중에서 개인적인 취향에 따라 구현 방법이 다를 것이라 생각된다. 하지만 개인적인으로는 [예제 1]의 방법을 사용하는데, 이는 선언부에는 선언만!하는게 좋다고 생각하고, 코드가 깔끔해 보이는 이유 때문이다.



728x90