다음을 통해 공유


inline, __inline, __forceinline

inline 및 __inline 지정자는 함수가 호출된 모든 위치에 함수 본문의 복사본을 삽입하도록 컴파일러에게 지시합니다.

inline function_declarator;   
__inline function_declarator;   // Microsoft Specific
__forceinline function_declarator;   // Microsoft Specific

설명

삽입 (인라인 확장 호출 또는 인라인)은 컴파일러의 비용/이익 분석 결과 이득을 예측할 경우에만 발생 합니다. 인라인 확장으로 코드 크기가 더 큰 경우 잠재적 비용 발생에서 함수 호출 오버 헤드를 줄입니다.

__forceinline 키워드는 비용/이익 분석을 무시하고 대신 프로그래머의 판단에 의존합니다. __forceinline을 사용할 때 특별히 주의해야 합니다. __forceinline을 무분별하게 사용할 경우 코드는 커지고 성능 향상은 미미할 수 있으며, 심지어 큰 실행 파일이 페이징이 증가되는 등의 이유로 성능 손실이 발생할 수도 있습니다.

이러한 함수 호출에 관련된 오버헤드를 제거했기 때문에 인라인 함수를 사용하여 프로그램을 빠르게 만들 수 있습니다. 인라인으로 확장된 함수는 일반 기능을 사용할 수 없는 코드 최적화의 대상이 됩니다.

컴파일러에서는 인라인 확장 옵션과 키워드를 권장 사항으로 처리합니다. 함수가 반드시 인라인되지는 않습니다. __forceinline 키워드를 사용하는 경우에도 특정 함수를 인라인하도록 강제로 컴파일러를 설정할 수는 없습니다. /clr로 컴파일하는 경우, 함수에 적용하는 보안 특성이 없으면 컴파일러는 함수를 인라인하지 않습니다.

인라인 키워드는 C++에서만 사용할 수 있습니다. __inline 및 __forceinline 키워드는 C와 C++ 모두에서 사용할 수 있습니다. 이전 버전과의 호환성을 위해 _inline은 __inline의 동의어입니다.

인라인 키워드에서는 인라인 확장의 기본임을 컴파일러에 알립니다. 그러나 컴파일러가 함수는 별도 인스턴스를 만들 수 있으며(인스턴스화) 인라인 코드를 삽입하는 대신 표준 호출 연결을 만듭니다. 두 경우에 문제가 발생할 수 있습니다.

  • 재귀 함수입니다.

  • 번환 단위의 다른 위치에서 포인터를 통해 참조되는 함수입니다.

이러한 이유들은 컴파일러의 재량으로 인라인 as may others에 간섭할 수 있으며, 여러분은 하나의 함수가 인라인될 수 있게 하는 inline 규제자에 의존할 필요는 없습니다.

일반 함수와 마찬가지로 인라인 함수에 대한 인수 계산 순서는 정의되어 있지 않습니다. 실제로, 일반 함수 호출 프로토콜을 사용하여 전달하는 경우 인수가 계산되는 순서와 다를 수 있습니다.

/Ob 컴파일러 최적화 옵션을 사용하면 인라인 함수 확장이 발생하는지 여부를 쉽게 결정할 수 있습니다.

/LTCG는 소스 코드에서 요청된 여부에 관계없이 크로스 모듈 인라인을 수행합니다.

예제 1

// inline_keyword1.cpp
// compile with: /c
inline int max( int a , int b ) {
   if( a > b ) 
      return a;
   return b;
}

클래스의 멤버 함수는 inline 키워드를 사용하거나 클래스 정의 내에 함수 정의를 배치하여 인라인으로 선언할 수 있습니다.

예제 2

// inline_keyword2.cpp
// compile with: /EHsc /c
#include <iostream>
using namespace std;

class MyClass {
public:
   void print() { cout << i << ' '; }   // Implicitly inline
private:
   int i;
};

Microsoft 전용

__inline 키워드는 inline과 같습니다.

__forceinline을 사용해도 컴파일러는 일부 상황에서 인라인 코드를 사용할 수 없습니다. 컴파일러에서 다음의 함수를 인라인할 수 없습니다.

  • 함수 또는 해당 함수의 호출자는 /Ob0 함께 컴파일됩니다(디버그 빌드에 대한 기본 옵션).

  • 함수와 호출자는 다양한 유형의 예외 처리, 즉 c + + 예외 처리에 하나, 구조화 예외 처리에 하나에 사용 합니다.

  • 함수가 가변 인수 목록을 사용합니다.

  • /Og, /Ox, /O1 또는 /O2로 컴파일되지 않는 한 함수는 인라인 어셈블리를 사용합니다.

  • 함수는 **#pragma inline_recursion(on)**에서 재귀되며 동반되지 않습니다. Pragma로 재귀 함수는 16번 호출의 기본 깊이를 인라인합니다. 인라인 깊이를 줄이기 위해 inline_depth pragma를 사용합니다.

  • 해당 함수는 가상이며 가상으로 호출됩니다. 가상 함수에 대한 직접 호출을 인라이닝할 수 있습니다.

  • 프로그램에서 함수의 주소를 가져와 함수 포인터를 통해 호출합니다. 주소를 가져온 함수에 대한 직접 호출을 인라이닝할 수 있습니다.

  • 함수는 또한 naked__declspec 한정자로 표시합니다.

컴파일러가 __forceinline으로 선언된 함수를 인라인할 수 없을 경우 수준 1 경고를 발생합니다.

재귀 함수는 대체 인라인에서 깊이 지정된 수의 inline_depth pragma이며 최대 16호출입니다. 해당 수준 뒤의 재귀 함수 호출은 함수 인스턴스에 대한 호출로 처리됩니다. 인라인 추론으로 검사하는 재귀 함수에 대한 깊이는 16을 초과할 수 없습니다. Inline_recursion pragma는 현재 확장 중인 함수의 인라인 확장을 제어합니다. 관련 정보는 인라인 함수 확장 (/Ob) 컴파일러 옵션을 참조하십시오.

Microsoft 전용 종료

inline 지정자 사용에 대한 자세한 내용은 다음을 참조하십시오.

참고 항목

참조

C++ 키워드

noinline

auto_inline