다음을 통해 공유


인라인, __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.

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

  • 재귀 함수입니다.

  • 번역 단위가 다른 위치에 포인터를 통해 참조 하는 함수입니다.

이러한 이유로 방해할 수 인라이닝, 는 있습니다 다른 사람에 게, 컴파일러의 재량에 에 종속 되어야는 인라인 지정자 인라인 될 함수를 발생할 수 있습니다.

일반 함수를 사용한 순서는 없습니다 정의 된 인라인 함수에는 인수를 평가 합니다.사실, 일반 함수 호출 프로토콜을 사용 하 여 전달 하는 경우 인수가 평가 되는 순서에서 다른 수 있습니다.

해당 /Ob 컴파일러 최적화 옵션을 수 있습니다 인라인 함수 확장 실제로 발생 여부를 결정 합니다.

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

예제 1

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

인라인은을 사용 하 여 클래스의 멤버 함수를 선언할 수 있습니다의 인라인 키워드 또는 함수 정의가 클래스 정의 내에 배치 합니다.

예제 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 키워드에 해당 하는 인라인.

도로 __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 특정 끝

사용에 대 한 자세한 내용은 인라인 지정자를 참조 하십시오.

참고 항목

참조

C + + 키워드

noinline

auto_inline