#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++ 프로그래밍


+ Recent posts