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

C언어 기반의 C++(01-4) 인라인(inline) 함수

by 머리올리자 2020. 12. 20.

in : 내부

line : 프로그램 코드라인

 

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

 

매크로 함수의 장점

"일반적인 함수에 비해서 실행속도의 이점이 있다" (포스트 링크)

 

단점

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

 

복습 예제

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

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

 

다음과 같이 생각 

 

"매크로 함수는 정의하기가 복잡하니, 일반 함수처럼 정의가 가능하면 좋겠다"

 

장점은 유지하되 단점은 제거할 수 있는 방법

 

C++은 이러한 요구사항을 만족시킨다.

 

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

#include <iostream>

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

참고로

 

매크로를 이용한 인라인화 : 전처리기

키워드 inline을 이용한 인라인화 : 컴파일러

 

매크로 함수에는 있지만, 인라인 함수에는 없는 장점

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

 

예를 들어서 매크로 함수가 다음과 같이 정의되면

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

자료형에 의존적이지 않은 함수가 된다.

 

따라서 다음 함수호출 문장은

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

다음과 같이 변환이 이뤄져서 어떠한 경우에도 데이터 손실이 발생하지 않는다.

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

 

하지만 다음과 같이 정의된 inline 함수는 

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

int형 기반으로 정의된 함수이기 때문에 다음의 함수호출 문장에서 데이터 손실이 발생

std::cout<< SQUARE(3.15);    //0.15가 손실되어 3x3인 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;
}

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