#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을 이용한 함수의 인라인화는 컴파일러에 의해서 처리가 됩니다. 따라서 컴파일러는 함수의 인라인화가 오히려 성능에 해가 된다고 판단할 경우, 이 키워드를 무시해버리기도 합니다. 또한 컴파일러는 필요한 경우 일부 함수를 임의로 인라인 처리하기도 합니다.
다음과 같이 정의된 인라인 함수는
inline int SQUARE(int x) { return x*x; }
int형 기반으로 정의된 함수이기 때문에 다음의 함수 호출 문장에서 데이터 손실이 발생합니다.
std::cout << SQUARE(3.15);
함수의 오버로딩을 통해서 이 문제를 해결할 수는 있으나, 그렇게 되면 여러 개의 함수를 추가로 정의하는 꼴이 되니, 한번만 정의하면 되는 매크로 함수의 장점과는 거리가 멀어지게 됩니다. 그러나 c++의 템플릿이라는 것을 이용하면 매크로 함수와 마찬가지로 자료형에 의존적이지 않은 함수가 완성됩니다.
#include <iostream>
template
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++ 프로그래밍
'C++ 프로그래밍 > 열혈 C++ 프로그래밍' 카테고리의 다른 글
참조자를 이용한 Call-by-reference (0) | 2017.03.13 |
---|---|
참조자의 이해 (0) | 2017.03.07 |
실행중인 프로그램의 메모리 공간 (0) | 2017.03.07 |
키워드 const의 의미 (0) | 2017.03.07 |
함수 오버로딩(Function Overloading) (0) | 2017.03.06 |