티스토리 뷰

주의 사항!

  • 이 글은 제가 직접 공부하는 중에 작성되고 있습니다.
  • 따라서 제가 이해하는 그대로의 내용이 포함됩니다.
  • 따라서 이 글은 사실과는 다른 내용이 포함될 수 있습니다.

 

C언어에서 '매크로 함수'라는 것을 배웠습니다. 인라인 함수는 매크로 함수의 장점을 유지하면서 단점을 줄인 C++의 매크로 함수라고 생각할 수 있습니다. 인라인 함수의 사용법을 예제를 통해 알아보겠습니다.

#include <iostream>

inline int SQUARE(int x)
{
	return x * x;
}

int main()
{
	std::cout << SQUARE(5) << std::endl;
	std::cout << SQUARE(12) << std::endl;
}

/*
실행결과

25
144

*/

 

위의 예제를 보면 인라인 함수는 inline 키워드를 맨 처음 사용함을 알 수 있습니다. 나머지는 일반 함수의 선언 및 정의와 다르지 않습니다. 만약 위의 예제를 매크로 함수로 구현한다면 다음과 같습니다.

#include <iostream>
#define SQUARE(x) ((x)*(x))

int main(void)
{
	std::cout << SQUARE(5) << std::endl;
	std::cout << SQUARE(12) << std::endl;

	return 0;
}

/*
실행결과

25
144

*/

 

매크로 함수는 전처리기에 의해서 처리되지만, 키워드 inline을 사용한 인라인 함수는 컴파일러에 의해 처리됩니다. 만약 컴파일러가 inline 키워드를 사용한 함수가 오히려 성능에 해가 된다고 판단하면 이 키워드를 무시하기도 합니다. 또한 컴파일러는 필요한 경우 일부 함수를 임의로 인라인 처리하기도 합니다.

 

사실 인라인 함수는 매크로 함수의 장점을 완전히 대체하지는 못했습니다.

#define SQUARE(x) ((x)*(x))

std::cout<<SQUARE(5);
std::cout<<SQUARE(3.14159);

 

위와 같이 정의된 매크로 함수는 자료형에 의존적이지 않으므로 인수 x의 자료형에 관계없이 사용할 수 있습니다. 하지만 다음과 같은 인라인 함수의 경우는 다릅니다.

inline int SQUARE(int x)
{
	return x * x;
}

std::cout<<SQUARE(5);
std::cout<<SQUARE(3.14159);

 

인라인 함수는 자료형에 의존적이며 3.14159를 인수로 받는 경우 정수로 연산이 되어 3*3 = 9가 됩니다. 이를 함수의 오버로딩을 이용해 보완할 수 있지만 그렇게 되면 여러 개의 함수를 선언하고 정의해야 합니다.

 

그러나 C++의 '템플릿'이라는 것을 이용하면 매크로 함수와 같이 자료형에 의존적이지 않은 함수를 만들 수 있습니다. 템플릿은 나중에 공부하게 되니 여기서는 간단한 예만 보이겠습니다.

#include <iostream>

template <typename T>
inline T SQUARE(T x)
{
	return x * x;
}

int main(void)
{
	std::cout << SQUARE(5.5) << std::endl;
	std::cout << SQUARE(12) << std::endl;

	return 0;
}

/*
실행결과

30.25
144

*/

 

위의 실행결과를 보면 매크로 함수와 같이 인수의 자료형에 관계없이 데이터 손실이 발생하지 않음을 알 수 있습니다.

 

인라인 함수는 겉보기에 inline 키워드만 붙었을 뿐 일반 함수와 별 다를 게 없어 보입니다. 그래서 인라인 함수만의 특장점이 무엇인지 잘 모를 수 있습니다. 일반 함수를 선언하고 호출하는 경우, 다음과 같은 일들이 일어납니다.

  • 호출된 함수를 위한 스택 메모리 할당
  • 실행 위치의 이동과 매개변수로의 인자 전달
  • return문에 의한 값의 반환

 

하지만 매크로 함수의 경우 이런 일련의 과정이 발생하지 않고 코드를 그대로 복붙하듯 동작하기 때문에 실행 속도는 일반 함수에 비해 빠릅니다. 앞서 인라인 함수는 C++의 매크로 함수라고 했습니다. 즉, 인라인 함수 역시 매크로 함수와 비슷하게 코드를 복붙하듯 동작합니다. 그러면서도 매크로 함수의 단점인 전역적인 특성과 디버깅하기 힘들다는 단점을 크게 보완하였습니다. 

 

인라인 함수는 간단한 함수를 구성할 때 사용하기 좋습니다. 하지만 이를 남용하게 될 경우에는 코드 실행 파일의 크기가 커지기 때문에 오히려 성능에 악영향을 줄 수 있습니다(인라인 함수가 호출될 때마다 코드를 복붙하므로). 하지만 inline 키워드를 사용해 인라인 함수를 정의해도 이 함수를 인라인 함수로 다룰 것인지 일반 함수로 다룰 것인지는 컴파일러 마음이므로 어쩌면 인라인 함수가 남용되었을 때 이를 일반 함수로 취급할지도 모를 일입니다.

 

호출 빈도가 낮고 간단한 함수는 인라인 함수로 정의하는 습관을 들여보는 것도 좋을 것 같습니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함