인라인 함수는 프로그램의 실행 속도를 높이기 위해 보강된 것이다. 인라인 함수를 이해하려면, 프로그램의 내부 구조를 깊이 있게 살펴볼 필요가 있다.
프로그램은 위에서 밑으로 순차적으로 실행이 된다. 각각의 명령들은 하나의 특정 메모리 주소를 가진다. 그러다가 일반 함수를 만나면, 그 함수 다음 명령의 주소를 메모리에 저장하고, 스택(이 목적을 위해 예약된 메모리 블록)에 매개변수를 복사한 후, 그 함수가 시작되는 메모리 위치로 점프한다. 그 다음에 그 함수의 코드를 실행하고, 리턴값을 복사한 후, 아까 저장해두었던 위치로 돌아온다. 이렇게 코드를 점프하는 과정은 시간이 좀 걸린다.
이 문제를 해결하기 위해서 인라인 함수가 등장했다. 인라인 함수에서는 컴파일된 함수 코드가 프로그램의 다른 코드 안에 직접 삽입되었다. 이 말은, 함수를 실행하기 위해서 점프하는 과정이 필요 없다는 뜻이다. 마치 함수 정의를 따로 쓰지 않고, 호출하는 곳에 쓴 것과 비슷하다. 따라서 인라인 함수는, 일반 함수보다 약간 빠르게 수행된다. 하지만 단점도 있다. 인라인 함수는 호출이 많을수록, 함수의 코드가 호출하는 곳에 써있는 거나 마찬가지이므로, 메모리 사용 측면에서는 불리하다.
따라서 인라인 함수는 신중하게 사용해야 한다. 함수 코드를 수행하는 시간이 비교적 짧고 빈번할 경우에 사용하는 것이 좋다고 할 수 있다.
인라인 함수를 사용하려면 함수 선언 or 함수 정의 앞에 inline 키워드를 붙이면 된다. 보통 함수 원형의 자리에 정의까지 해놓는다.
inline double square(double x) { return x * x; }
int main()
{
double a, b;
double c = 13.0;
a = square(5.0);
b = square(4.5 + 7.5);
cout << "a : " << a << endl;
cout << "b : " << b << endl;
cout << "c의 제곱 = " << square(c++) << endl;
cout << "현재 c : " << c << endl;
}
실행 결과.
#define SQUARE(X) X*X
double d = SQUARE(5.0);
double e = SQUARE(4.5 + 7.5);
double f = 13.0;
cout << "d : " << d << endl;
cout << "e : " << e << endl;
cout << "f의 제곱 = " << SQUARE(f++) << endl;
cout << "현재 f : " << f << endl;
이렇게 하고 아까 코드랑 비교해보자.
위의 결과랑 조금 다르다. 변수 e를 구할 때는 매크로가 이런식으로 작용하기 때문이다.
4.5 + 7.5*4.5 + 7.5
의도한 바로 작용하게 하고 싶으면, 괄호를 넣어주어야 한다.
#define SQUARE(X) (X)*(X)
하지만 이렇게 해도 변수 f가 15가 되는 걸 막을 순 없다. (f++)*(f++) 이런식으로 두 번 증감되기 때문이다. 그러니 주의해야 한다.