삶의 공유
[C++]인라인(Inline) 함수 본문
#열혈 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 |