728x90
*윤성우의 열혈 C++ 프로그래밍 교재로 학습하며 정리하였습니다.
매크로 함수
매크로 함수의 장점
-> 일반적인 함수에 비해서 실행 속도의 이점이 있다.
매크로 함수의 단점
-> 정의하기가 어렵다.
-> 복잡한 함수를 매크로의 형태로 정의하는데 한계가 있다.
매크로 함수의 예시
#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;
}
매크로를 이용한 함수의 의인화는 전처리기(#define 등)에 의해서 처리되지만
키워드 inline을 이용한 함수의 인라인화는 컴파일러에 의해서 처리가 된다.
따라서 컴파일러는 함수의 인라인화가 오히려 성능에 해가 된다고 판단할 경우,
인라인 키워드를 무시해버리기도 한다;;
또한 필요한 경우 일부 함수를 임의로 인라인 처리하기도 한다;;;
매크로 함수에는 있지만, 인라인 함수에는 없는 장점
#define SQUARE(x) ((x)*(x))
//매크로 함수는 자료형에 의존적이지 않다.
std::cout<< (12); //int형 함수 호출
std::cout<< (3.15); //double형 함수 호출
//위의 함수 호출 문장은 아래와 같이 변환이 이루어진다.
std::cout << ((12)*(12));
std::cout << ((3.15)*(3.15));
//따라서 어떠한 경우에도 데이터의 손실이 발생하지 않는다.
//하지만! 다음과 같이 정의된 인라인 함수는
inline int SQUARE(int x) {return x*x}
//int형 기반으로 정의된 함수이기 때문에 아래와 같은 상황에서 데이터 손실이 발생!!
std::cout << SQUARE(3.15); // 3 * 3 = 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;
}
템플릿에 관해서는 이후에 자세하게 다시 설명하겠다.
728x90
'공부 > C++' 카테고리의 다른 글
[C++] 2-1. C언어 복습 (0) | 2024.09.11 |
---|---|
[C++] 1-5. 이름 공간 (0) | 2024.09.09 |
[C++] 1-3. 매개변수의 디폴트 값 (0) | 2024.09.08 |
[C++] 1-2. 함수 오버로딩 (1) | 2024.09.08 |
[C++] 1-1. 입력과 출력 (0) | 2024.09.05 |