DevNote

#define 대신 Inline 본문

C++/Effective

#define 대신 Inline

Ahnda 2020. 3. 11. 13:43

C++에서의 함수 호출

 C++에서는 함수가 호출되면 우선 스택에 함수로 전달할 파라미터와 함께 호출이 끝난 뒤 돌아갈 반환 주소값을 저장한다. 그리고는 프로그램의 제어가 해당 함수의 위치로 넘어와 함수 내에 선언된 지역 변수도 스택에 저장한다.

 

이때부터 함수의 모든 코드를 실행하게 되고, 실행이 전부 끝나면 반환값을 넘겨준다. 그리곤 스택에 저장된 돌아갈 반환 주소값으로 이동하여, 스택에 저장된 함수 호출정보를 제거한다. 이러한 과정은 매 함수마다 일어난다. 아래의 그림을 보면 이해가 빠를거다.

 

Fig 1. 함수 호출 과정


Inline 함수

 앞서 설명했듯 C++에서 함수의 호출은 꽤 복잡한 과정을 거치기 때문에, 코드가 복잡해지고, 무게가 무거워지면 호출시간이 쌓이고 쌓여 느린 코드가 될 수도 있다. C++에서는 이러한 경우에 사용할 수 있는 Inline함수라는 것을 제공한다. Inline함수는 호출될 때, 일반적인 함수 호출 과정을 생략하고, 함수 내 모든 코드를 호출된 자리에 바로 삽입하는 방식의 함수다. 

 

그러나 코드가 매우 적은 함수만 인라인 함수로 선언하는 것이 좋다. 함수 호출시간은 절약되지만, 호출 과정으로 생기는 이점을 포기해야하므로....

->(함수 실행시간이 오래 걸리면, 함수 호출시간은 문제 X, 함수 실행시간이 매우 짧으면, 함수 호출시간도 부담)

 


<예제>

#include <iostream>
using namespace std;

template <typename T>
inline T Max(T& const a, T& const b) { return (a > b ? a : b); } // 최대값을 반환하는 인라인 함수

int main()
{
	int a = 10;
	int b = 20;

	cout << "최댓값은 " << Max(a, b) << "입니다." << endl;

	return 0;
}

<결과>

 

위의 예제에서 Max()함수는 Inline 함수로 정의되어 호출된다. 보통 Inline 함수는 크기가 작으므로, 함수의 원형이 나오는 자리에 함수의 본체까지 함계 정의하는 경우가 많다. 

 

위의 예제는 실제로 다음과 같이 인라인 코드로 삽입되어 실핸된다.

int main()
{
	int a = 10;
	int b = 20;

	cout << "최댓값은 " << (a > b ? a : b) << "입니다." << endl;

	return 0;
}

 


먜크로 함수와 인라인 함수

C에서는 C++의 Inline 함수와 비슷한 기능의 매크로 함수를 사용한다. #define 전처리 지시문에 인수로 함수의 정의를 전달함으로써, 함수처럼 동작하는 매크로를 만들 수 있다. 이를 매크로 함수라고 한다.

 

하지만 매크로 함수는 다음과 같은 이유로 인해 치명적인 단점이 있다.

 - 매크로 함수는 일반 함수와는 다르게 '단순치환'만 해준다.

 - #define은 전처리기가 처리하며, #define으로 정의된 이름은 실제 값으로 모두 치환해 놓는다.

위의 두 가지 이유로 아래와 같은 문제가 발생할 수도 있다.

- 컴파일러는 #define으로 지정한 이름이 아니라 값으로 인식하기 때문에 문제의 원인을 찾기 어려울 수 있다.

 - 컴파일러는 #define으로 정의된 이름을 상수로 보고 각 호출마다 메모리를 할당하기 때문에 메모리를 추가적으로 잡아먹는다.

 

아래의 예제를 통해 매크로 함수의 문제점을 보여준다.

#include <iostream>

#define MAX(a, b) a > b ? a : b	// 최댓값을 반환하는 매크로 함수

using namespace std;

int main()
{
	int a = 10;
	int b = 20;
	int result = 0;
	 
	result = MAX(a, b);
	cout << "최댓값은 " << result << "입니다." << endl;

	result = MAX(a, ++b);
	cout << "최댓값은 " << result << "입니다." << endl;


	return 0;
}

위의 예제에서 MAX(a, ++b)의 결과는 예상했던 것과 많이 다르다. 그 이유는 매크로 함수의 단순 치환하는 방식 때문이다. 이러한 문제를 해결하기 위해 Inline이라는 개념이 C++에서 도입된 것이다. 

 

앞에서도 계속 언급했는데, Inline 함수는 함수 내 모든 코드를 인라인 코드로 삽입해 주는 것이다. 따라서 일반 함수처럼 값이나 수식을 인수로 전달할 수 있으며, 파라미더 타입에 맞춘 자동 타입 변환도 지원한다(template).

'C++ > Effective' 카테고리의 다른 글

Effective C++ Item3:: const를 적극 활용! review  (0) 2020.03.12