in (내부) + line (프로그램 코드라인) 함수
==> 프로그램 코드라인 안으로 들어가버린 함수
매크로 함수
매크로 함수
C언어에서는 #define 선행처리 지시문에 인수로 함수의 정의를 전달함으로써, 함수처럼 동작하는 매크로를 만들 수 있다.이러한 매크로를 함수 같은 매크로(function-like macro) 또는 매크로 함수라고 한다.
*자세한 내용은 C언어 이야기의 chapter 19 참고
https://ojh0616.tistory.com/280
전처리 지시자 (1)
전처리 ==> 전처리기가 소스 코드를 컴파일하기 좋게 다듬는 과정이며 소스 코드에서 #으로 시작하는 지시자를 처리한다 다양한 전처리 지시자 파일을 포함하는 #include #include는 지정한 파일의
ojh0616.tistory.com
장점
- 일반적인 함수에 비해서 실행속도의 이점이 있다
단점
- 정의하기가 어렵다
- 복잡한 함수를 매크로의 형태로 정의하는데 한계가 있다 (그냥 함수를 쓰는 게 더 좋다)
매크로 함수 정의
#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; //SQUARE 함수를 호출
std::cout << SQUARE(12) << std::endl;
return 0;
}
- 매크로를 이용한 함수의 인라인화는 전처리기에 의해서 처리된다
- 키워드 inline을 이용한 함수의 인라인화는 컴파일러에 의해서 처리가 된다
- 컴파일러는 함수의 인라인화가 성능에 해가 된다고 판단할 경우, 키워드 inline을 무시한다
매크로 함수에는 있지만, 인라인 함수에는 없는 장점
#define SQUARE(x) ((X)*(x))
std::cout<< SQUARE(12);
std::cout<< ((12)*(12)); // 변환이 이루어짐
std::cout<< SQUARE(3.15);
std::cout<< ((3.15)*(3.15)); // 변환이 이루어짐
==> 이렇게 변환이 이루어져도 데이터의 손실이 발생하지 않는다
inline int SQUARE(int x) { return x*x; }
std::cout<<SQUARE(3.15); //0,15가 손실되어서 3x3의 결과인 9가 출력된다
==> int형 기반으로 정의된 함수이기 때문에 다음의 함수호출 문장에서 데이터 손실이 발생한다
* 그러나 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;
}
==> 디버그 창에서 볼 수 있듯이 템플릿을 사용했더니 데이터의 손실이 발생하지 않았다
*즉 C++에서 탬플릿과 inline 함수를 같이 사용하면 최고로 좋은 성능을 이끌어 낼 수 있다*
'C++ 이야기 (열혈) > C언어 기반의 C++' 카테고리의 다른 글
6. OOP 단계별 프로젝트 01단계 (0) | 2023.01.10 |
---|---|
5. 이름공간(namespace)에 대한 소개 (0) | 2023.01.10 |
3. 매개변수의 디폴트 값 (Default Value) (0) | 2023.01.02 |
2. 함수 오버로딩 (Function Overloading) (0) | 2022.12.30 |
1. printf와 scanf를 대신하는 입출력 방식 (0) | 2022.12.27 |