KPlay의 코딩 그리고 잡동사니

C언어에서는 선행처리기가 처리해주는 '매크로'와 그의 연장선인 '매크로 함수'라는것이 있었다

가령 #define A B

라는 코드를 작성해두면

컴파일 전의 선행처리 과정에서 선행처리기가 코드를 읽어서

A라는것을 발견하면 B로 '치환'시키는 간단한 문법

즉, 함수의 호출부분을 몸체부분으로 교체시키는것이었다.

매크로 함수도 별 다를것없이

예를들어 #define SQUARE(x) ((x)*(x))처럼 '치환'이 기본 원리였다

매크로의 장점으로는 단순치환이기 때문에 빠른 연산속도가 있었고

(컴파일 단계로 넘어가계되면 함수의 변수들은 별도의 메모리공간(스택 등)에 할당되고 실행의 이동과 반환과정을 거쳐야한다)

단점으로는

1. 복잡한 연산에 사용하기에는 한계가 있다

2. 디버깅이 어렵다.

3. 선행처리기의 연산적인 기능의 한계로 각각의 연산문에 괄호를 쳐줘야하는 번거로움이 있다.

이러한 장점을 유지하고 단점을 보완한 C++의 문법이 inline 선언이다.

3행의 함수에 inline선언을 넣어

8행과 9행의 SQUARE함수의 호출문장을

return x * x 의 몸체부분으로 바로 교체해버리고 싶다고 하고있다.

그러면 컴파일러가 컴파일을 하며 함수의 호출문장을 몸체부분으로 바꿔준다

따라서 매크로 함수처럼 함수호출로 인한 메모리공간의 할당과 반환과정을 생략하기때문에

성능의 향상으로 이어진다.

또한, 매크로함수가 아닌 일반적인 함수선언이기 때문에 복잡한 함수들도 inline함수로 선언이 가능하게 되며

컴파일러가 처리하기때문에 디버깅또한 쉬우며 선행처리기와 달리 연산능력도 갖춰져있어

괄호를 번거롭게 쳐줄 필요가 없다.

그런데 inline선언은 컴파일러에 의해서 처리된다.

따라서 컴파일러가 함수의 인라인화를 결정하기때문에 프로그래머가 inline선언을 해준다고

무조건 inline처리가 되는것도 아니고 inline선언이 없어도 인라인 처리가 될 수 있다.

함수를 매크로화 하는 조건에는 1. 라인 수가 적어야하며 2. 빈번하게 사용이 되야한다 등이 있었다.

이러한 조건을 충족하느냐 안하느냐를 컴파일러가 직접 판단해서 inline화를 시킬지 말지 결정하는것이다.

즉, 프로그래머는 컴파일러에게 inline화를 '제안'하는것에 불과하다

마치, C에서 나온 프로그래머가 이 변수는 빈번하게 써주는 때문에 CPU와 가장 가까운

Register 메모리 공간에 저장하라고 선언해도 판단은 컴파일러가 하는것과 비슷하다.

인라인 함수에는 없는 매크로 함수만의 장점

매크로 함수는 자료형에 독립적이다. 따로 자료형이 무엇이라고 명시할 필요가 없다.

그러나 인라인 함수같은 경우 컴파일러가 처리하기때문에 자료형을 명시해줘야하는 단점이 있다.

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band