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++ 프로그래밍] - 대부분의 내용 및 코드는 이 책에서 개인 공부 정리 목적으로 참고하였습니다.
'Language&Framework&Etc > C++' 카테고리의 다른 글
C언어 기반의 C++ 2(02-1) 시작에 앞서 (0) | 2020.12.20 |
---|---|
C언어 기반의 C++(01-5) 이름공간(namespace)에 대한 소개 (0) | 2020.12.20 |
C언어 기반의 C++(01-2) 함수 오버로딩(Function Overloading) (0) | 2020.12.19 |
C언어 기반의 C++(01-1) printf와 scanf를 대신하는 입출력 방식 (0) | 2020.12.19 |
1-5 이름공간(namespace)에 대한 소개 추가(함수 선언 정의) (0) | 2020.11.18 |