본문 바로가기
Object Oriented Programming(C++)/열혈 C++ 프로그래밍

C++ | 01-4 인라인 함수(Inline Function)

by continue96 2021. 7. 24.

 

1. 인라인 함수(Inline Function)

1.1 인라인 함수의 선언과 정의

 C언어의 매크로 함수는 일반적인 함수보다 실행 속도가 빠르다는 장점을 가지고 있지만 정의하기가 상대적으로 어려워 복잡한 함수를 매크로 형태로 사용하는데 한계가 있다. 이 매크로 함수의 단점을 없앤 인라인 함수는 매크로 함수를 일반 함수처럼 정의할 수 있게 해준다. 인라인 함수를 정의하려면 다음과 같은 형식을 따르면 된다.

inline functionType functionName(...) {
	statements;
}

 

InlineFunction.cpp
#include <iostream>
// #define SQUARE(X) ((X)*(X))는 매크로 함수입니다.

inline int SQUARE(int x) {// 이것은 인라인 함수입니다.
	return x*x;
}

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

 

InlineFunction.cpp 실행 결과
25
100

 4행의 키워드 inline 선언을 통해서 함수 SQUARE가 인라인 함수가 되었다. 9행과 10행에서 SQUARE 함수를 호출하면 함수의 몸체가 호출문을 대체하게 되는데, 이것을 함수의 인라인화라고 한다. 참고로 매크로 함수의 인라인화는 전처리기에 의해 처리되지만, 인라인 함수의 인라인화는 컴파일러에 의해 처리된다. 컴파일러는 함수의 인라인화가 오히려 성능에 방해가 된다고 판단할 경우 inline 키워드를 무시하거나, 함수의 인라인화가 요구되는 경우 일부 함수를 임의로 인라인화하기도 한다.

 

[한줄 요약] 인라인 함수란?
매크로 함수를 일반 함수처럼 정의할 수 있게 해주는 함수로, 키워드 inline을 선언하여 함수를 인라인화 한다.

 

1.2 인라인 함수의 한계

 사실 위의 인라인 함수는 매크로 함수의 장점을 완전히 대체하지 못했다. 매크로 함수는 자료형에 독립적인 함수, 즉 자료형과 상관없이 호출이 가능한 함수이다.

#define SQUARE(X) ((X)*(X))
...
std::cout << SQUARE(10);	// int형 함수를 호출하여 ((10)*(10))로 대체된다.
std::cout << SQUARE(1.1);// double형 함수를 호출하여 ((1.1)*(1.1))로 대체된다.

 

 이렇게 자료형에 맞게 변환이 이루어져 큰 문제가 없는 매크로 함수와 다르게, 다음 인라인 함수는 int형 매개 변수가 정의된 함수이기 때문에 double형 인자가 전달되면 데이터 손실이 발생한다. 물론 템플릿을 사용하면 매크로 함수와 마찬가지로 자료형에 의존적이지 않은 함수를 정의할 수 있으나, 이것은 나중에 다루도록 하겠다.

inline SQUARE(int x) {
	return x*x;
}
...
std::cout << SQUARE(10);
std::cout << SQUARE(2.22);// 0.22이 손실되어 4가 출력된다.

 

댓글