C-매크로(Macro) ,인라인(Inline)

정세형·2023년 8월 25일

C

목록 보기
1/1

서론

함수를 많이 사용하는 C코드의 실행속도를 높혀줄 수 있는 매크로인라인 함수에 대해 사용방법, 장단점 등을 포스팅 해보겠습니다.

오버헤드란?(Overhead)

오버헤드란 프로그램의 실행흐름에서 나타나는 현상중 하나입니다. 예를 들어 , 프로그램의 실행흐름 도중에 동떨어진 위치의 코드를 실행시켜야 할 때 , 추가적으로 시간,메모리,자원이 사용되는 현상입니다.

이러한 현상은 특히 프로그래밍 시에 외부 함수를 사용할 때 나타납니다.

실행 흐름이 도중에 끊겨버리고 , 함수를 사용하기 위해 스택메모리를 할당합니다. 매개변수가 있다면 대입연산까지도 일어납니다. 이 외에도 함수를 호출하기 위해 많은 과정을 진행하게 됩니다. 이 때 예상하지 못하는 자원들이 소모되는 현상이 바로 오버헤드 현상입니다.

이러한 오버헤드를 줄이고자 매크로함수인라인함수를 사용하여 최적화합니다.

매크로(Macros)

C 언어에서 매크로(매크로 함수)는 코드를 대체하여 간단한 코드 조각을 더 효율적으로 작성하고 관리하는 데 사용되는 기능입니다. 매크로는 주로 #define 지시문을 사용하여 정의됩니다. 이러한 매크로는 컴파일러에 의해 코드의 특정 부분으로 치환되기 때문에 함수 호출의 오버헤드 없이 빠르게 실행될 수 있습니다.

#include <stdio.h>
#define MUL(X, Y) X*Y
#define PRINT(X) printf("%d\n", X)  

int main(void) {
    int a = 2, b = 3;  
    PRINT(MUL(a, b));  // 6
    return 0;
}

진짜 함수는 아니고 함수처럼 동작하게 하는 일종의 방법으로 치환을 사용합니다. 아래 수식을 보면 X X 식에 1 + 2가 들어갈 때 3 3이 아닌 1 + 2 * 1 + 2로 동작합니다. 이런 부분이 치환을 사용하는 부분이며, 함수와 동작하는 방식이 많이 다르므로 사용에 주의해야 합니다.

#include <stdio.h>
#define MUL_1(X) X*X
#define MUL_2(X) ((X)*(X))
#define PRINT(X) printf("%d\n", X)  

int main(void) {
    PRINT(MUL_1(1 + 2));  // 1 + 2 * 1 + 2 = 5
    PRINT(MUL_2(1 + 2));  // ((1 + 2) * (1 + 2)) = 9
    return 0;
}  

매크로는 단순 치환을 해주는 것이기 때문에 자주 사용하는 부분을 대체하는 용도로 주로 사용한다고 합니다. 단순히 코드를 치환해준다고 생각하면 되기 때문에 자료형을 지정하거나 하지 않습니다.

함수를 실행하는 것이 아니라 그저 코드를 적어주는 동작과 같기 때문에 프로그램의 실행 속도를 올려준다는 장점이 있습니다. 다만 의도대로 작동하지 않을 가능성이 높아 반복적으로 사용하는 코드를 간결화하거나 간단하게 사용하는 용도로 적합할 것 같습니다.

인라인 함수

인라인 inline 함수는 함수 호출 오버헤드를 줄이기 위해 사용되는 다른 기술입니다. 인라인 함수는 컴파일러에게 함수 호출 대신 해당 함수의 본문을 호출 부분에 직접 삽입하도록 지시합니다. 이로써 함수 호출에 따른 오버헤드를 줄이고 프로그램의 실행 속도를 높일 수 있습니다. 그러나 매크로와 달리 인라인 함수는 컴파일러가 최적화를 위해 판단하므로 인라인으로 정의된 함수가 항상 인라인으로 처리되지는 않을 수 있습니다.

#include <stdio.h>

inline int multiple(int a, int b) {
    return a * b;
}

int main(void) {
    int result;
    result = multiple(2, 3);
    printf("%d\n", result);  // 6
    return 0;
}

기존의 함수를 사용하는 방법과 전혀 다르지 않지만 해당 코드는 컴파일을 실행하면 다음과 같이 변경됩니다.

#include <stdio.h>

inline int multiple(int a, int b) {
    return a * b;
}

int main(void) {
    int result;
    result = inline int multiple(2, 3) {
        return 2 * 3;
    }
    printf("%d\n", result);  // 6
    return 0;
}

인라인 함수는 선언한 함수의 코드를 함수가 실행되는 부분에 복제하여 작동합니다. 함수를 따로 실행하지 않고 작동할 수 있기 때문에 실행속도가 빨라집니다. 하지만 코드가 물리적으로 길어지다보니 용량이 커질 수 있습니다. 빠른 속도를 중요시 하는 부분에서 사용하면 적합할 것입니다.

profile
👨‍💻github.com/pos1504 💌pos1504@gmail.com 🙋‍♂️https://www.linkedin.com/in/%EC%84%B8%ED%98%95-%EC%A0%95-68067b287/

0개의 댓글