in은 '내부'를 뜻하고 line은 '프로그램 코드라인'을 뜻한다 따라서 inline 함수를 직역하면 '프로그램 코드라인 안으로 들어가버린 함수'를 의미한다
매크로 함수의 장점
매크로 함수의 단점
#include <iostream>
#define SQURE(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;
}
위 예제와 같이 함수의 몸체 부분이 함수 호출 문장을 완전히 대체했을 때 '함수가 인라인화 되었다' 라고 표현한다
그러면
"매크로 함수는 정의하기 복잡하니, 일반 함수처럼 정의가 가능하면 좋겠다!"
라는 생각이 들것이다
인라인 함수는 이런 요구사항들을 만족한다
#include <iostream>
//인라인 함수 정의
inline int SQAURE(int x){
return x*x;
}
int main(void){
//인라인 함수 호출
std::cout<<SQAURE(5)<<std::endl;
std::cout<<SQAURE(12)<<std::endl;
return 0;
}
매크로 함수의 인라인 화는 전처리기에 의해서 처리 되지만, inline 키워드를 이용한 함수의 인라인화는 컴파일러에 의해서 처리된다
컴파일러는 함수의 인라인화가 오히려 성능 저하를 불러일으킨다고 판단되면 키워드를 무시하기도 한다.
사실 위의 인라인 함수는 매크로 함수의 장점을 대체하지 못했다.
예를들어
#define SQUARE(x) ((x)*(x))
와 같이 정의되면 자료에 의존적이지 않은 함수로 정의 할 수있다.
std::cout<< SQUARE(12)<<std::endl; //int형 함수 호출
-> std::cout<<((12)\*(12))<<std::endl; //int형
std::cout<< SQUARE(3.15)<<std::endl; //double형 함수 호출
->std::cout<<((3.15)\*(3.15))<<std::endl; //double
매크로 함수는 이런식으로 변환이 이루어져 데이터의 손실이 발생하지 않는다
inline int SQAURE(int x){
return x*x;
}
하지만 다음과 같이 정의된 인라인 함수는 int형 기반으로 정의된함수이기 때문에 다음과 같은 형태의 함수 호출 문장에서 데이터 손실이 발생한다
std::cout<< SQURE(3.15);
하지만 이 부분도 C++의 템플릿을 이용한다면 데이터 손실을 해결 할 수있다. 여기서는 간단하게 예시만 보이고 넘어가겠다.
#include <iostream>
template <typename T>
inline T SQAURE(T x){
return x*x;
}
int main(void){
std::cout<<SQAURE(5.5)<<std::endl;
std::cout<<SQAURE(12)<<std::endl;
return 0;
}