매크로 함수와 인라인(Inline) 함수
in은 '내부', line은 '프로그램 코드라인'을 의미한다.
즉 프로그램 코드라인 안으로 들어가 버린 함수라는 뜻이다.
매크로, 일반 함수, 인라인 함수 모두 결과는 동일하지만 결과를 위한 과정이나 성격은 상당히 다르다!
◎ 매크로 함수
#define 선행 처리 지시문에 인수로 함수의 정의를 전달해서 함수처럼 동작하는 매크로를 만드는 것이다.
물론 일반 함수와는 달리 단순 치환만을 해주므로, 일반 함수와 완전히 똑같은 방식으로 동작하지는 않는다.
매크로 함수는 일반적인 함수에 비해 실행 속도에서 이점이 존재하지만 가독성도 떨어질 수 있고 디버깅도 어려우며 복잡한 함수를 매크로의 형태로 정의하는 것에 한계가 존재한다.
빠른 이유?
일반 함수처럼 호출된 함수를 위한 스택 메모리의 할당을 할 필요도, 실행위치의 이동과 매개변수로의 인자를 전달할 필요도, return 문에 의한 값의 반환을 할 필요도 없기 때문이다.
매크로 함수의 예시.
#define Add(x) ((x)+(x))
int main()
{
int a = Add(3);
cout << a << endl;
}
이렇게 실행하면 a의 출력값은 6이 나올 것이다.
왜 '전처리 과정'을 거칠까?
#와 ## 연산자는 선행처리기 연산자이다.
이 선행처리기 연산자는 전처리기-> 어셈블러로 넘어가기 전에 전처리기가 # 뒤에 붙은 코드들을 처리하기 때문이다. 그래서 전처리 과정에서 처리한다.
그리고 이 과정은
#define Add(x) ((x)+(x))
int main()
{
int a = Add(3);
cout << ((3)+(3)) << endl;
}
이런 과정을 거치게 되는데 위와 같이 함수의 몸체 부분이 함수 호출 문장을 완전히 대체했을 때 '함수가 인라인화 됐다'고 표현한다.
◎ 인라인 함수
인라인 함수는 매크로 함수의 장점은 유지하고 단점은 제거했다고 볼 수 있다.
또한 인라인 함수는 inline 예약어를 빼면 기존 함수와 다를 바 없고 자료형 등이 지정돼 있어 문법적으로도 완벽한 함수이다.
매크로를 이용한 함수의 인라인화는 전처리기에 의해 처리되지만 키워드 inline을 이용한 함수의 인라인화는 컴파일러에 의해 처리된다.
inlineint Add(int x)
{
return x+x;
}
int main()
{
int a = Add(3);
cout << a << endl;
}
그러나 매크로 함수의 장점을 인라인 함수가 완벽하게 가져오지 못한 부분도 있다.
예를 들면 위의 매크로 함수의 예시에서 x는 자료형에 의존적이지 않다.
즉 실수를 넣든, 정수를 넣든 데이터 손실이 발생하지 않는다.
3을 넣으면 6이 1.92를 넣으면 3.84가 나오게 된다.
하지만 인라인 함수는 자료형 기반으로 정의된 함수이기 때문에 int 자료형 기반에서 1.92를 넣게 되면 0.84의 손실이 발생한다.
물론 함수의 오버로딩을 통해 문제 해결이 가능하지만 간단하게 한 번만 정의하면 된다는 매크로 함수의 장점과는 멀어지게 된다.
그런데 C++에는 이에 대한 해결책이 또 하나 존재한다. 바로 템플릿을 이용하는 것이다. 템플릿을 이용하면 여러 번 정의하지 않아도 한 번에 해결된다!
◎ 추가
Visual Studio를 통해 컴파일할 경우, 인라인으로 선언하지 않았더라도 적합하면 인라인 함수로 확장하는 설정이 있다.
반대로 인라인으로 선언했다고 해도 적합하지 않다면 일반 함수로 컴파일한다.
기본값은 '인라인 함수로 사용하는 데 적합한 함수는 모두 인라인 함수로 만든다'는 의미이다.
설정값은 보통 '기본값'으로 지정돼 있다.
참고 출처;
http://tcpschool.com/c/c_prepro_macroFunc (코딩의 시작, TCP School ; 매크로 함수)
윤성우의 열혈 C 프로그래밍 ( 저; 윤성우, 출판사 ; 오레지 미디어)
이것이 C++이다 ( 저; 최호성, 출판사 ; 한빛미디어 )
'Study > C++ , C#' 카테고리의 다른 글
[C++] 클래스(Class)와 구조체(Struct)의 차이 (0) | 2020.01.15 |
---|---|
[C++] QueryPerformanceCounter / 프로그램 실행 시간 측정 (0) | 2020.01.15 |
[C++] new 와 delete (0) | 2020.01.10 |
[C++] 참조자와 함수 (0) | 2020.01.08 |
[C++] 참조자란? (Reference) (0) | 2020.01.08 |