inline 함수

출처 : http://allwiz.egloos.com/2746656

다음의 글은 C++ 책에 나오는 인라인 함수 대한 글을 요약한 자료로 일반 함수와 인라인 함수의 차이점, 특징, 사용법을 이야기 한다.

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);
}

4. 인라인 사용 예• inline 한정자를 사용하여 함수를 선언한다.• inline 함수의 정의는 그것을 호출하는 어떠한 함수보다도 앞에 있어야 한다.double CalcSquare(const double& dblVaule) { return (dblVaule*dblVaule); }※ 

Leave a Reply