인라인 함수 : "프로그램 코드라인 안으로 들어가버린 함수"
매크로 함수의 장점
- 일반적인 함수에 비해서 실행속도의 이점이 있음
매크로 함수의 단점
- 정의하기 어려움, 복잡한 함수를 매크로 형태로 정의하는데 한계가 있음
매크로란?
매크로(macro, 문화어: 마크로)는 컴퓨터 과학 분야에서 정해진 순서에 따라 어떻게 특정한 입력 시퀀스 (문자열을 가리키기도 함)가 출력 시퀀스 (이 또한 문자열을 가리키기도 함)로 매핑되어야 하는지를 정의하는 규칙이나 패턴을 말한다.
#define에 인수로 함수의 정의, 함수처럼 동작
매크로 함수 예시
#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;
}
SQUARE(5) => ((5)*(5))
- 함수의 몸체 부분이 함수호출 문장을 완전히 대체했을 때 "함수가 인라인화 되었다"
- 그러나 문제가 있음 => 매크로 함수는 정의하기가 복잡하기 때문에 일반 함수처럼 정의가 가능한가?
- C++은 가능하다
C++ 기반의 인라인 함수 정의
매크로 함수를 사용하지 않고 c++ 기반의 인라인 함수 정의
#include <iostream>
/* #define으로 매크로 함수 정의하던 것이 inline 함수로 정의됨*/
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으로 대체
- 더 복잡한 함수 정의 가능
매크로 : 전처리기에 의해 처리
인라인화 : 컴파일러에 의해 처리
그러나 인라인 함수도 단점이 있음
매크로 함수 vs 인라인 함수
/* 매크로 함수 */
#define SQUARE(x) ((x) * (x))
std::cout << SQUARE(12);
std::cout << SQUARE(3.5);
/* inline 함수 */
inline int SQUARE(int x) { return x*x; }
std::cout << SQUARE(12);
std::cout << SQUARE(3.5);
매크로 결과부터 보자
값이 잘 출력되는 것을 알 수 있다.
인라인 결과를 보자
매크로와 달리 3.5 제곱시 값의 손실이 일어난다.
이는 인라인 함수에서 인자를 받을 때 int 형으로 받게 정의되어 있어 3.5가 3으로 값이 변경되기 때문이다.
오버로딩을 통해서 이 문제를 해결할 수 있지만, 그렇게 되면 여러 개의 함수를 추가적으로 정의하는 꼴이 되어, 매크로 함수의 장점과는 거리가 멀어진다.
=> 이 부분은 템플릿으로 해결 가능하다고 함
참고 : [윤성우 열혈 C++ 프로그래밍] - 대부분의 내용 및 코드는 이 책에서 개인 공부 정리 목적으로 참고하였습니다.
'Language&Framework&Etc > C++' 카테고리의 다른 글
1-5 이름공간(namespace)에 대한 소개 추가(함수 선언 정의) (0) | 2020.11.18 |
---|---|
1-5 이름공간(namespace)에 대한 소개 (0) | 2020.11.18 |
1-3 매개변수의 디폴드값 (0) | 2020.11.18 |
1-2 함수 오버로딩 (0) | 2020.11.18 |
1. 입출력 방식 (0) | 2020.11.17 |