CPP 공부를 하다가 매크로 함수와 인라인 함수가 나왔다.
내가 C 공부를 제대로 안한건지 C에서 나왔다는데 난 처음 보는 것 같다.
그래서 CPP하는 김에 뭔가 좀 알아놓고 넘어가야 할 것 같아서 포스팅하고 넘어가기~~~
매크로 함수는 #define
을 통해 함수처럼 동작하는 매크로를 의미한다.
쉽게 말해서 그냥 #define으로 정의해서 좀 편하게 쓰는거
일단 백문이 불여일견이라고 예시로 바로 확인하자
#include <iostream>
#define SQUARE1(x) x*x
#define SQUARE2(x) ((x)*(x))
int main() {
int x = 1;
std::cout<<SQUARE1(x+5)<<std::endl;
std::cout<<SQUARE2(x+5)<<std::endl;
return 0;
}
위 코드에서 #define
으로 두 개의 매크로 함수를 정의했다.
차이는 괄호의 유무로 괄호가 있고 없고에 따라서 결과가 달라지기 때문이다.
그럼 결과를 살펴보자
11
36
SQUARE1은 11, SQUARE2는 36이 나왔다.
이렇게 결과값이 다른 이유는 직접 대입해보면 쉽게 알 수 있다.
SQUARE1 = 1+5*1+5 = 1+5+5 = 11
SQUARE2 = (1+5)*(1+5) = 36
직접 확인해보니 왜 결과가 다른지 알 수 있다.
그냥 웬만하면 괄호를 항상 써주는 걸로 하자.
인라인 함수는 우리가 보통 알고 있는 함수 정의 방식으로 정의한다.
인라인 함수를 사용하는 가장 큰 이유는 실행속도가 빠르기 때문이다. 일반 함수보다 빠른데 그 이유는 함수의 호출 방식의 차이 때문이다.
일반 함수의 호출
메모리에 일반 함수 저장 -> 함수 호출 -> 함수 주소로 이동 -> 함수 실행 -> 다시 원래 위치로 이동
인라인 함수 호출
일반 함수와 달리 함수를 호출할 때 바로 인라인 함수의 코드가 치환되서 실행되기 때문에 주소 이동이 없어 실행 속도가 빠르다.
예시
#include <iostream>
inline int SQUARE(int x) {
return x * x;
}
int main() {
std::cout<<SQUARE(5)<<std::endl;
}
// SQUARE(5) 자리에 바로 `5*5`가 치환되어서 들어감
// std::cout<<5*5<<std::endl;와 같이
출력결과
25
인라인 함수는 inline
키워드를 사용해 선언한다.
단, 클래스 멤버함수가 인라인 함수를 호출하기 위해서는 인라인 함수의 선언이 헤더파일에 존재해야 한다.
물론 인라인 함수의 단점도 존재한다.
매크로 함수와 비슷하게 쓰이지만 인수의 타입을 판단하기 때문에 여러가지 타입의 인수를 오버로딩하면 코드가 길어진다.
매크로를 이용한 함수의 인라인화는 전처리기에 의해 처리되고, inline 키워드를 이용한 함수의 인라인화는 컴파일러에 의해 처리 된다.
그래서 컴파일러는 함수의 인라인화가 오히려 성능에 해가 된다고 판단할 경우, 키워드를 무시하기도 한다. 또한 컴파일러는 필요한 경우 일부 함수를 임의로 인라인 처리하기도 한다.
kyun2world님의 [C++ 기본] 매크로 함수와 인라인 함수를 참고해서 작성했습니다