인라인함수(inline)



정의:

매크로 함수와 마찬가지로 치환함수입니다.




원형:

inline 반환형식 이름 ( 인자)

ex)

inline int abc(int x,int y)
{
return x+y;
}




설명:

함수정의 부분앞쪽에 inline 키워드를 준거빼곤 일반 함수정의와 다를게없습니다

하지만 함수와 큰차이점이잇습니다

인라인이라는 점에서 알수있듯이

인라인함수를호출한 함수내에서 벗어나지않고 값을 치환하여 작동합니다.

반대로 함수는 함수호출시 기존함수에서벋어나 함수정의한 부분으로 넘어가

처리합니다.

ex)

inline int abc(int x,int y)
{
return x+y;
}
                                      --------->>    
int main()                                                        int main()
{                                                                    {
cout<<abc(1,2)                                               cout<<1+2
}                                                                    }


매크로함수와다르게 무조건 치환이 아니기떄문에

활용하기 좀더 용의하다고 할수잇습니다

ex)

inline int abc(int x,int y)
{
return x*y;
}

int main()
{
cout<<abc(1+2,1+2);
}

출력
9;



정리:

매크로함수와 인라인함수는 비슷하지만

간단한작업이아니라면 인라인함수가 좀더 효율적으로 사용될수있다



다음의 글은 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);
}

[예제 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]의 방법을 사용하는데, 이는 선언부에는 선언만!하는게 좋다고 생각하고, 코드가 깔끔해 보이는 이유 때문이다. 


※ 참고 자료 
1. Stephen Prata, C++  기초 플러스, 성안당, pp.366-369 
2. Scott Meyers, Effective C++, Addison-Wesley, Item 30 pp.134-139


'Embedded Lab > linux, x86' 카테고리의 다른 글

[8장 커널 동기화 개요]  (0) 2012.01.26
[Top-Half와 Bottom-Half]  (0) 2012.01.26
[커널의 종류]  (0) 2012.01.11
[프로세스의 상태 정리]  (0) 2012.01.04
[Slab Allocator]  (0) 2012.01.04
Posted by cyj4369
,