삶의 공유

[C++]인라인(Inline) 함수 본문

Programing/C++

[C++]인라인(Inline) 함수

dkrehd 2020. 10. 21. 21:09
728x90
반응형

#열혈 C++프로그래밍(책)

Inline 함수란 ?

: in (내부) line(프로그램 코드 라인)을 의미 함. 즉, 프로그램 코드라인 안으로 들어가 버린 함수 라는 뜻.

 

inline함수를 이해하기 위해서는 우선 C언어의 매크로 함수를 알아야 한다.

 

매크로 함수(#define 함수 이름(인자) 치환할 것)

#define square(x) x* x

 : 위 문장의 의미는 square 라는 이름의 매크로 함수로 인자로 x 를 받아서 x*x 로 치환한다는 의미 입니다. 여기서 #define의 의미는 '치환역할을 수행한다' 입니다.

> 매크로 함수의 대표적인 장점은 일반적인 함수에 비해서 실행속도의 이점이 있다.

> 단점은, 정의하기가 어렵다. 복잡한 함수를 매크로의 형태로 정의하는데 한계가 있다.

 

C언어 기반 인라인 함수(매크로함수) 에 대해 세부적으로 살펴보면,

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

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

위의 코드는 전처리 과정을 거치면

#include <iostream>

int main(void)
{
	std::cout << ((5) * (5)) << std::endl; // 함수의 몸체 부분이 함수의 호출 부분을 대체
}

위와 같이 함수의 몸체 부분이 함수 호출문장을 완전히 대체 했을 때 '함수가 인라인화 되었다' 라고 표현한다.

이렇게 인라인화가 되면 실행속도에 대한 이점이 있다.

 

C++기반 인라인 함수는 C언어 기반의 단점인 정의하기가 복잡한 문제를 보완하고, 장점인 실행속도에 대한 이점을 그대로 가져왔다.

예제를 통해서 확인하면,

#include <iostream>

inline int SQUARE(int x) // inline 키워드를 선언하여 인라인 함수를 선언 및 정의함
{
	return x * x;
}

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

 

그러나, C++ 기반 인라인 함수가 매크로함수의 장점을 완전히 대체하지는 못한다.  원인은 자료형 의존적이기 때문이다.

 

자세히 살펴보면 하기와 같이 매크로 함수는 자료형에 의존적이지 않은 함수이다.

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

std::cout << SQUARE(12); // ((12) * (12)) - int형 함수 호출

std::cout << SQUARE(3.15); // ((3.15) * (3.15)) - double 형 함수 호출

 

하지만 C++기반 인라인 함수는,

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

std::cout << SQUARE(3.15); // 0.15가 손실 되어 ((3) * (3)) 인 9가 출력!

이 경우 데이터 손실이 발생

 

 * 템플릿을 이용하면 매크로 함수와 마찬가지로 자료형에 의존적이지 않은 함수가 완성되지만, 이부분은 추후에 다시 다루도록 하자.

간단히 예제만 살펴보면,

#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;
}

위와 같이 하면 데이터 손실이 발생하지 않고 인라인 함수를 구현할 수 있다.

반응형

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

[C++] 코딩테스트 준비(백준, 고양이문제)  (0) 2021.01.14
[C++] Call by reference & Call by Value  (0) 2020.11.09
[C++]참조자(Reference) 정의  (0) 2020.11.02
C++ 자료형 bool  (0) 2020.10.26
[C++]namespace(이름 공간)  (0) 2020.10.21