C 언어에서 성능을 높이기 위해 함수 호출을 생략하는 두 가지 방법이 있는데
매크로함수(#define)와 인라인함수(inline)가 있는데 둘 다 성능을 최적화하는 목적이 있지만, 동작 방식과 안전성에서 차이가 있습니다.
매크로 함수
1. 매크로 함수는 전처리기 단계에서 코드가 단순 치환되고 함수 호출 오버헤드가 없습니다
2. 하지만 디버깅이 어렵고, 타입 검사가 불가능하며, 예상치 못한 부작용이 발생할 수 있습니다
#include <stdio.h>
#define SQUARE(x) ((x) * (x)) //매개변수를 괄호로 감싸야 안전
int main() {
int a = 5;
printf("SQUARE(5) = %d\n", SQUARE(a)); //25출력
//예상치 못한 동작 발생 가능
printf("SQUARE(2 + 3) = %d\n", SQUARE(2 + 3)); //(2+3)*(2+3) = 25(괄호 없으면 2+3*2+3=11)
return 0;
}
장점 | 함수 호출 오버헤드 없음 |
단점 | 모든 데이터 타입에서 사용 가능 |
인라인 함수
1. 컴파일러가 함수 호출을 실제 코드로 치환하는 기능
2. 매크로 함수처럼 함수 호출 오버헤드가 없지만, 컴파일러의 최적화 대상이 되며, 타입 검사가 가능
#include <stdio.h>
static inline int square(int x) { //static을 붙이면 다른 파일에서 중복 정의 방지
return x * x;
}
int main() {
int a = 5;
printf("square(5) = %d\n", square(a)); //25 출력
printf("square(2 + 3) = %d\n", square(2 + 3)); //25 (안전하게 동작)
return 0;
}
장점 | 함수 호출 오버헤드 없음 타입 검사 가능 |
단점 | 지나치게 크거나 재귀적인 함수는 인라인화되지 않음 컴파일러가 항상 인라인으로 치환하는 것은 아님 |
비교 항목 | 매크로함수 (#define) | 인라인함수(inline) |
타입 검사 | ❌ 없음 (버그 발생 가능) | ✅ 있음 (컴파일러가 검사) |
디버깅 | ❌ 어려움 (치환된 코드 확인해야 함) | ✅ 쉬움 (함수 내부 추적 가능) |
함수 호출 오버헤드 | ❌ 없음 | ❌ 없음 |
코드 최적화 | ❌ 전처리기 단계에서 단순 치환 | ✅ 컴파일러가 최적화 |
안전성 | ❌ 연산자 우선순위 문제 발생 가능 | ✅ 문제 없음 |
'C언어 > 시큐어코딩' 카테고리의 다른 글
[PRE00-C] ~ [PRE10-C] (0) | 2025.03.13 |
---|---|
시큐어코딩을 위한 C언어 기본 용어 (0) | 2025.03.11 |