programing

인라인 함수 vs 프리프로세서 매크로

goodcopy 2022. 7. 23. 13:50
반응형

인라인 함수 vs 프리프로세서 매크로

인라인 함수는 프리프로세서 매크로와 어떻게 다릅니까?

프리프로세서 매크로는 코드에 적용되는 대체 패턴일 뿐입니다.컴파일이 시작되기 전에 확장으로 대체되므로 코드의 거의 모든 곳에서 사용할 수 있습니다.

인라인 함수는 본문이 콜사이트에 직접 삽입되는 실제 함수입니다.함수 호출이 적절한 경우에만 사용할 수 있습니다.

이제 기능과 같은 컨텍스트에서 매크로와 인라인 함수를 사용하는 경우 다음과 같이 하십시오.

  • 매크로는 타입 세이프가 아니기 때문에 구문적으로 정확한지 여부에 관계없이 전개할 수 있습니다.컴파일 단계에서는 매크로 전개 문제로 인한 에러가 보고됩니다.
  • 매크로를 예기치 않은 상황에서 사용할 수 있기 때문에 문제가 발생합니다.
  • 매크로는 다른 매크로를 확장할 수 있다는 점에서 유연성이 높지만 인라인 함수는 그렇지 않습니다.
  • 매크로는 패턴 내 어디에나 입력 식이 복사되기 때문에 확장으로 인해 부작용이 발생할 수 있습니다.
  • 인라인 함수가 항상 인라인으로 제공되는 것은 아닙니다.일부 컴파일러는 릴리스 빌드에서만 또는 특별히 인라인 함수로 구성된 경우에만 이 기능을 수행합니다.또한 경우에 따라 인라인화가 불가능할 수 있습니다.
  • 인라인 함수는 변수(특히 정적)에 대한 범위를 제공할 수 있으며, 프리프로세서 매크로는 코드 블록 {...}에서만 이 작업을 수행할 수 있으며 정적 변수는 정확히 동일한 방식으로 동작하지 않습니다.

첫째, 프리프로세서 매크로는 컴파일 전 코드의 "복사 붙여넣기"에 불과합니다.그래서 타입 체크가 없고 부작용이 나타날 수 있습니다.

예를 들어, 두 값을 비교하는 경우:

#define max(a,b) ((a<b)?b:a)

경우 수 있습니다.max(a++,b++)를 들어 )a ★★★★★★★★★★★★★★★★★」b2시)를 들어 을 사용하세요.

inline int max( int a, int b) { return ((a<b)?b:a); }

매크로와 인라인 함수의 차이를 알기 위해서는 먼저 매크로가 정확히 무엇인지, 언제 사용해야 하는지 알아야 합니다.

기능:

int Square(int x)
{
    return(x*x);
}

int main()
{
    int value = 5;
    int result = Square(value);
    cout << result << endl;
}
  • 함수 콜에는 오버헤드가 관련되어 있습니다.함수의 실행이 완료되면 반환처를 알아야 하므로 함수를 호출하기 전에 반환 주소를 스택에 저장합니다.소규모 애플리케이션의 경우 이는 문제가 되지 않을 수 있지만, 예를 들어 초당 수천 건의 트랜잭션이 발생하는 재무 애플리케이션에서는 함수 호출 비용이 너무 많이 들 수 있습니다.

매크로:

# define Square(x) x*x;
int main()
{
    int value = 5;
    int result = Square(value);
    cout << result << endl;
}
  • 이치노에서는 '아주 좋다'는 으로 되어 있습니다.#define됩니다.

int result = 제곱(x*x

그러나 매크로로 인해 예기치 않은 동작이 발생할 수 있습니다.

#define Square(x) x*x
int main()
{
    int val = 5;
    int result = Square(val + 1);
    cout << result << endl;
}

출력은 36이 아니라 11입니다.

인라인 기능:

inline int Square(int x)
{
    return x * x;
}

int main()
{
    int val = 5;
    int result = Square(val + 1);
    cout << result << endl;
}

출력: 36

inline키워드는 컴파일러가 함수 호출을 함수의 본문으로 대체하도록 요구합니다.여기서 출력은 처음에 식을 평가한 후 결과를 사용하여 함수의 본문을 수행하므로 정확합니다.인라인 함수는 반환 주소 또는 함수 인수를 스택에 저장할 필요가 없기 때문에 함수 콜의 오버헤드를 줄입니다.

매크로와 인라인 기능의 비교:

  1. 매크로는 텍스트 치환을 통해 동작하지만 인라인 함수는 함수의 로직을 복제합니다.
  2. 인라인 함수는 안전한 반면 매크로는 대체로 인해 오류가 발생하기 쉽습니다.
  3. 매크로는 함수 포인터에 할당할 수 없습니다.인라인 함수는 할당할 수 있습니다.
  4. 매크로는 여러 줄의 코드로 사용하기 어렵지만 인라인 함수는 그렇지 않습니다.
  5. C++에서는 멤버 함수와 함께 매크로를 사용할 수 없지만 인라인 함수는 사용할 수 있습니다.

결론:

인라인 함수는 사용하기에 안전하기 때문에 매크로보다 유용할 수 있지만 함수 호출 오버헤드를 줄일 수도 있습니다.inline키워드는 컴파일러에 대한 요구입니다.특정 함수는 다음과 같이 인라인화되지 않습니다.

  • 큰 기능
  • 조건부 인수가 너무 많은 함수
  • 재귀 코드 및 루프 등이 있는 코드

컴파일러가 다른 방법으로 작업을 수행하는 것이 더 나은지 판단할 수 있도록 하는 것은 좋은 일입니다.

인라인 함수는 컴파일러에 의해 확장되며, 여기서 매크로가 프리프로세서에 의해 확장되는 것은 텍스트 대체에 불과합니다.

이런 이유로,

  • 함수 호출 중에 유형 검사가 수행되는 동안 매크로 호출 중에 유형 검사가 수행되지 않습니다.

  • 매크로 확장 중에는 인수와 조작 순서를 재평가하기 때문에 바람직하지 않은 결과와 비효율성이 발생할 수 있습니다.예를 들어 다음과 같습니다.

    #define MAX(a,b) ((a)>(b) ? (a) : (b))
    int i = 5, j = MAX(i++, 0);
    

    이 될 것이다

    int i = 5, j = ((i++)>(0) ? (i++) : (0));
    
  • 매크로 인수가 매크로 확장 전에 평가되지 않습니다.

     #include <stdio.h>
     #define MUL(a, b) a*b
    
     int main()
     {
         // The macro is expended as 2 + 3 * 3 + 5, not as 5*8
         printf("%d", MUL(2+3, 3+5));
         return 0;
     }
     // Output: 16
    
  • return 키워드를 매크로에서 사용하여 함수의 경우와 같이 값을 반환할 수 없습니다.

  • 인라인 함수는 과부하가 될 수 있습니다.

  • 은 연산자 ""를 할 수 .##Token-Pasting 연산자.

  • 일반적으로 매크로는 코드 재사용에 사용됩니다.이 경우 인라인 함수는 함수 호출 중 시간 오버헤드(초과 시간)를 제거하기 위해 사용됩니다(서브루틴으로의 점프 회피).

또 , 한수 : 한 걸음 더 나아가면 안 됩니다.#define을 사용법

중요한 차이점은 유형 확인입니다.컴파일러는 사용자가 입력값으로 전달한 것이 함수에 전달 가능한 유형인지 확인합니다.프리프로세서 매크로에서는 그렇지 않습니다.모든 타입 체크 전에 확장되기 때문에 버그를 검출하기 어려운 경우가 있습니다.

여기 몇 가지 덜 분명한 요점들이 있습니다.

매크로가 네임스페이스를 무시하고 있습니다.그게 그들을 사악하게 만들죠

#include<iostream>
using namespace std;
#define NUMBER 10 //macros are preprocessed while functions are not.
int number()
{ 
    return 10;
}
/*In macros, no type checking(incompatible operand, etc.) is done and thus use of micros can lead to errors/side-effects in some cases. 
However, this is not the case with functions.
Also, macros do not check for compilation error (if any). Consider:- */
#define CUBE(b) b*b*b
int cube(int a)
{
 return a*a*a;
}
int main()
{
 cout<<NUMBER<<endl<<number()<<endl;
 cout<<CUBE(1+3); //Unexpected output 10
 cout<<endl<<cube(1+3);// As expected 64
 return 0;
}

매크로는 실제 함수 호출 오버헤드를 수반하지 않기 때문에 일반적으로 함수보다 속도가 빠릅니다.

매크로의 몇 가지 단점:유형 확인은 없습니다.단순한 교환의 원인이 되기 때문에 디버깅이 어렵습니다.매크로에는 네임스페이스가 없으므로 코드의 한 섹션에 있는 매크로가 다른 섹션에 영향을 줄 수 있습니다.위의 CUBE() 예시와 같이 매크로에 의해 부작용이 발생할 수 있습니다.

매크로는 보통 하나의 라이너입니다.단, 여러 줄로 구성될 수 있습니다.함수에는 이러한 제약이 없습니다.

인라인 함수는 매크로와 비슷합니다(컴파일 시에 함수 코드가 콜 포인트로 확장되기 때문에). 인라인 함수는 컴파일러에 의해 해석되지만, 매크로는 프리프로세서에 의해 확장됩니다.그 결과, 몇 가지 중요한 차이가 있습니다.

  • 인라인 기능은 일반 기능에 적용되는 모든 형식 안전 프로토콜을 따릅니다.
  • 인라인 함수는 함수 선언에 inline 키워드를 포함하는 것을 제외하고 다른 함수와 동일한 구문을 사용하여 지정합니다.
  • 인라인 함수에 인수로 전달된 식은 한 번 평가됩니다.
  • 경우에 따라서는 매크로에 인수로 전달된 식을 여러 번 평가할 수 있습니다.http://msdn.microsoft.com/en-us/library/bf6bf4cf.aspx

  • 매크로는 디버깅에 사용할 수 없지만 인라인 함수를 사용할 수 있습니다.

-- 좋은 기사: http://www.codeguru.com/forum/showpost.php?p=1093923&postcount=1

;

인라인 함수는 값의 의미를 유지하는 반면 프리프로세서 매크로에서는 구문만 복사합니다.인수를 여러 번 사용하면 프리프로세서 매크로에서 매우 미묘한 버그가 발생할 수 있습니다.예를 들어 "i++"와 같은 변환이 인수에 포함되어 있는 경우 두 번 실행되는 것은 매우 놀라운 일입니다.인라인 함수에서는 이 문제가 발생하지 않습니다.

인라인 함수는 일반 함수와 동일하게 구문적으로 동작하며, 함수 로컬 변수에 대한 안전성과 범위를 제공하며, 메서드인 경우 클래스 멤버에 대한 액세스를 제공합니다.또, 인라인 메서드를 호출할 때는, 프라이빗/보호에 관한 제한에 준거할 필요가 있습니다.

GCC에서는 함수를 인라인으로 선언하는 것은 컴파일러에 대한 힌트에 불과합니다.호출할 때마다 함수의 본문을 포함시킬지 여부는 여전히 하루의 끝에 컴파일러에게 달려 있습니다.

인라인 함수와 프리프로세서 매크로의 차이는 비교적 큽니다.프리프로세서 매크로는 결국 텍스트 대체에 불과합니다.컴파일러가 인수 및 반환 유형에 대해 유형 검사를 수행할 수 있는 많은 기능을 포기했습니다.인수의 평가는 크게 다릅니다(함수에 전달하는 식에 부작용이 있으면 디버깅에 매우 즐거운 시간을 보낼 수 있습니다).기능과 매크로를 사용할 수 있는 장소에는 미묘한 차이가 있습니다.예를 들어 다음과 같습니다.

#define MACRO_FUNC(X) ...

여기서 매크로_FUNC는 함수의 본문을 명확하게 정의합니다.모든 경우에 올바르게 실행되도록 특별한 주의를 기울여야 합니다. 예를 들어, 제대로 작성되지 않은 MACRO_와 같은 기능을 사용할 수 있습니다.FUNC는 에러를 일으킵니다.

if(MACRO_FUNC(y)) {
 ...body
}

일반 기능은 문제없이 사용할 수 있습니다.

코딩의 관점에서 인라인 함수는 함수와 같다.따라서 인라인 함수와 매크로의 차이는 함수와 매크로의 차이와 동일합니다.

컴파일의 관점에서 인라인 함수는 매크로와 유사합니다.호출되지 않고 코드에 직접 주입됩니다.

일반적으로 인라인 함수는 몇 가지 마이너 최적화가 혼재된 일반 함수로 간주해야 합니다.대부분의 최적화와 마찬가지로 실제로 적용할 필요가 있는지 여부는 컴파일러의 판단에 달려 있습니다.컴파일러는 다양한 이유로 함수를 인라인화하려는 프로그래머의 시도를 기꺼이 무시합니다.

인라인 함수는 명령의 반복 실행을 방지하기 위해 반복 또는 재귀 문이 있는 경우 함수 호출로 동작합니다.프로그램의 전체 메모리를 저장하는 데 도움이 됩니다.

언급URL : https://stackoverflow.com/questions/1137575/inline-functions-vs-preprocessor-macros

반응형