본문 바로가기
Language&Framework&Etc/C++

1-4 인라인(inline) 함수

by 머리올리자 2020. 11. 18.

인라인 함수 : "프로그램 코드라인 안으로 들어가버린 함수"


매크로 함수의 장점

  • 일반적인 함수에 비해서 실행속도의 이점이 있음

매크로 함수의 단점

  • 정의하기 어려움, 복잡한 함수를 매크로 형태로 정의하는데 한계가 있음

매크로란?

매크로(macro, 문화어: 마크로)는 컴퓨터 과학 분야에서 정해진 순서에 따라 어떻게 특정한 입력 시퀀스 (문자열을 가리키기도 함)가 출력 시퀀스 (이 또한 문자열을 가리키기도 함)로 매핑되어야 하는지를 정의하는 규칙이나 패턴을 말한다. 

[위키피디아 참고]

 

매크로 (컴퓨터 과학) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

#define에 인수로 함수의 정의, 함수처럼 동작

 

매크로 함수 예시

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

int main(void)
{
	std::cout << SQUARE(5) << std::endl;
	return 0;
}

매크로 처리시

#include <iostream>

int main(void)
{
	std::cout << ((5)*(5)) << std::endl; // 몸체 부분이 함수호출 문장을 완전히 대체
	return 0;
}

SQUARE(5) => ((5)*(5))

 

  • 함수의 몸체 부분이 함수호출 문장을 완전히 대체했을 때 "함수가 인라인화 되었다"
  • 그러나 문제가 있음 => 매크로 함수는 정의하기가 복잡하기 때문에 일반 함수처럼 정의가 가능한가?
  • C++은 가능하다

C++ 기반의 인라인 함수 정의

 

매크로 함수를 사용하지 않고 c++ 기반의 인라인 함수 정의

 

#include <iostream>

/* #define으로 매크로 함수 정의하던 것이 inline 함수로 정의됨*/
inline int SQUARE(int x)
{
	return x * x;
}

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

	return 0;
}
  • #define => inline으로 대체
  • 더 복잡한 함수 정의 가능

매크로 : 전처리기에 의해 처리

인라인화 : 컴파일러에 의해 처리

 

그러나 인라인 함수도 단점이 있음

 

매크로 함수 vs 인라인 함수

/* 매크로 함수 */
#define SQUARE(x) ((x) * (x))

std::cout << SQUARE(12);      
std::cout << SQUARE(3.5);     

/* inline 함수 */

inline int SQUARE(int x) { return x*x; }
std::cout << SQUARE(12);      
std::cout << SQUARE(3.5);

 

매크로 결과부터 보자

값이 잘 출력되는 것을 알 수 있다.

 

인라인 결과를 보자

매크로와 달리 3.5 제곱시 값의 손실이 일어난다.

 

이는 인라인 함수에서 인자를 받을 때 int 형으로 받게 정의되어 있어 3.5가 3으로 값이 변경되기 때문이다.

 

오버로딩을 통해서 이 문제를 해결할 수 있지만, 그렇게 되면 여러 개의 함수를 추가적으로 정의하는 꼴이 되어, 매크로 함수의 장점과는 거리가 멀어진다.

 

=> 이 부분은 템플릿으로 해결 가능하다고 함

 

참고 : [윤성우 열혈 C++ 프로그래밍] - 대부분의 내용 및 코드는 이 책에서 개인 공부 정리 목적으로 참고하였습니다.