inline

Jaemyeong Lee·2024년 8월 9일
0

FastCampusC++

목록 보기
47/78

C++ inline 키워드와 매크로에 대한 코드 분석

inline 함수는 컴파일러에게 함수 호출 대신 함수 본문을 직접 코드에 삽입하라고 요청하는 기능을 제공합니다. 이를 통해 함수 호출에 따른 오버헤드를 줄일 수 있지만, 항상 인라인화가 이루어지는 것은 아니며, 과도한 인라인화는 실행 파일의 크기를 크게 할 수 있습니다. 이번 포스트에서는 inline 함수와 매크로를 사용한 예제를 한 줄씩 분석하고, 그 의미를 자세히 설명하겠습니다.

1. inline 함수 정의

inline int square(int x)
{
    return x * x;
}
  • inline 키워드: 이 키워드는 컴파일러에게 함수 호출 대신 함수 본문을 호출하는 위치에 삽입하도록 제안합니다. 이로 인해 함수 호출에 따른 스택 관리 비용을 줄일 수 있습니다.
    • 하지만 inline요청일 뿐, 컴파일러가 항상 이를 따르는 것은 아닙니다. 컴파일러가 코드 크기나 최적화를 고려해 인라인화를 하지 않을 수도 있습니다.
    • 함수 내용: square 함수는 입력된 정수 x의 제곱 값을 계산하여 반환합니다.

2. 매크로를 사용한 인라인

#define SQUARE(X) X*X
  • #define 매크로: 전처리기 매크로로, 코드에서 SQUARE(X)가 발견되면 컴파일 전에 X*X로 대체됩니다.
    • 주의점: 매크로는 단순히 텍스트 대체이므로, 예상치 못한 결과를 초래할 수 있습니다. 예를 들어, 매크로 인수에 복잡한 표현식을 전달할 경우, 이 표현식이 의도치 않게 여러 번 평가될 수 있습니다.

3. main 함수에서의 inline 함수 및 매크로 사용

int main()
{
    int x = square(10);
    cout << x << endl;
  • int x = square(10);: square 함수는 10을 입력받아 10*10 = 100을 반환합니다. 이 함수가 inline으로 처리될 경우, 실제 코드에서 x10*10으로 직접 대체됩니다.
  • cout << x << endl;: 변수 x의 값을 출력합니다. 결과는 100이 됩니다.
    int y = 10;
    cout << SQUARE(++y) << endl; // 의도치 않은 결과 발생
}
  • int y = 10;: 변수 y10으로 초기화합니다.
  • cout << SQUARE(++y) << endl;: 여기서 매크로 SQUARE가 문제를 일으킬 수 있습니다. 매크로는 단순 텍스트 대체이기 때문에, SQUARE(++y)++y * ++y로 대체됩니다.
    • ++yy의 값을 먼저 11로 증가시키고, 그런 다음 곱셈이 이루어지므로 11 * 11 = 121이 됩니다.
    • 하지만, 만약 ++y가 두 번 실행되었다면, y의 값이 두 번 증가하여 12 * 12 = 144가 출력될 수 있습니다.
    • 이는 매크로 사용의 단점 중 하나로, 예기치 않은 부작용을 초래할 수 있습니다.

주요 포인트 정리

  1. inline 함수:

    • 함수 호출에 따른 오버헤드를 줄일 수 있어 성능 최적화에 도움이 될 수 있습니다.
    • 하지만, 컴파일러가 무조건 인라인화를 수행하는 것은 아니며, 코드 크기가 커질 수 있습니다.
  2. 매크로 사용의 위험성:

    • 매크로는 단순 텍스트 대체이므로, 예상치 못한 부작용을 일으킬 수 있습니다. 특히 복잡한 표현식을 인수로 전달할 때 주의가 필요합니다.
    • inline 함수는 이러한 문제를 피할 수 있는 대안으로, 컴파일러가 타입과 문맥을 고려해 처리하기 때문에 보다 안전합니다.
  3. 매크로 대신 inline 함수 사용 권장:

    • C++에서는 매크로 대신 inline 함수를 사용하는 것이 더 안전하고, 예측 가능한 결과를 얻을 수 있습니다. inline 함수는 타입 검사와 같은 C++의 일반적인 컴파일러 검사를 통과하기 때문에 오류를 줄일 수 있습니다.
profile
李家네_공부방

0개의 댓글