수색…


소개

inline 지정자로 정의 된 함수는 인라인 함수입니다. 인라인 함수는 One Definition Rule 을 위반하지 않고 여러 번 정의 될 수 있으므로 외부 링크가있는 헤더에 정의 할 수 있습니다. 컴파일러에 대한 함수 인라인 힌트를 선언하면 코드 생성 중에 함수가 인라인되어야하지만 보증은 제공되지 않습니다.

통사론

  • inline 함수 inline
  • inline 함수 정의
  • 클래스 {function_definition};

비고

보통 함수에 대해 생성 된 코드가 충분히 작 으면 인라인 될 좋은 후보입니다. 왜 그렇게? 함수가 크고 루프에서 인라인 된 경우 모든 호출에 대해 큰 함수의 코드가 복제되어 생성 된 바이너리 크기가 부풀어 오르게됩니다. 그러나 얼마나 작은 것이 충분합니까?

인라인 함수는 오버 헤드 호출 기능을 피하기 위해 좋은 방법이 될 것 같다 있지만, 그것은 표시된 모든 기능을하지 않도록 유의해야한다의 inline 인라인된다. 즉, inline 이라고하면 명령이 아니라 컴파일러의 힌트 일뿐입니다. 컴파일러는 함수를 인라인 할 의무가 없으며 무시할 수 있습니다. 대부분 컴파일러가 무시합니다. 현대 컴파일러는 컴파일러가이 함수의 인라이닝 제안을 심각하게 받아 들였을 때,이 키워드가 과거의 흔적이라는 최적화를하는 것이 좋습니다. inline 으로 표시되지 않은 함수조차도 컴파일러가 이점을 얻을 때 인라인됩니다.

연계 지시어로 인라인

현대 C ++에서 inline 을 더 실용적으로 사용하면 연결 지시어로 사용하게됩니다. 선언하지 않고 여러 소스에 포함될 헤더의 함수를 정의 할 때 각 번역 단위에는 ODR (One Definition Rule) 위반을 초래 하는이 함수의 자체 복사본이 있습니다. 이 규칙은 대략 하나의 함수, 변수 등의 정의 만있을 수 있다고 말합니다.이 위반을 피하기 위해 함수 정의를 inline 표시하면 암시 적으로 함수가 내부적으로 연결됩니다.

FAQs

C ++에서 함수 / 메소드에 대한 'inline'키워드는 언제 작성해야합니까?

함수가 헤더에 정의되기를 원할 때만. 함수의 정의가 여러 컴파일 단위에 나타날 수있는 경우에만 더욱 정확하게. 컴파일러가 코드를 최적화하는 동안 컴파일러에게 더 많은 정보를 제공하기 때문에 헤더 파일에 작은 (하나의 라이너에서와 같이) 함수를 정의하는 것이 좋습니다. 컴파일 시간도 증가합니다.

C ++에서 함수 / 메소드에 대한 키워드 'inline'을 작성하지 않아야합니까?

컴파일러가 인라인하면 코드가 더 빨리 실행될 것이라고 생각할 때 inline 추가하지 마십시오.

컴파일러는 언제 함수 / 메소드를 인라인으로 만들지 모를 것입니까?

일반적으로, 컴파일러는 당신보다 더 잘할 수 있습니다. 그러나 컴파일러에는 함수 정의가없는 경우 코드를 인라인하는 옵션이 없습니다. 최대한 최적화 된 코드에서는 대개 모든 개인 메소드가 요청되었는지 여부에 관계없이 인라인됩니다.

참고 사항

비 멤버 인라인 함수 선언

inline int add(int x, int y);

비 구성원 인라인 함수 정의

inline int add(int x, int y)
{
    return x + y;
}

멤버 인라인 함수

// header (.hpp)    
struct A
{
    void i_am_inlined()
    {
    }
};

struct B
{
    void i_am_NOT_inlined();
};

// source (.cpp)    
void B::i_am_NOT_inlined()
{
}

함수 인라이닝이란 무엇입니까?

inline int add(int x, int y)
{
    return x + y;
}

int main()
{
    int a = 1, b = 2;
    int c = add(a, b);
}

위의 코드에서 add 가 인라인되면 결과 코드는 다음과 같이됩니다.

int main()
{
    int a = 1, b = 2;
    int c = a + b;
}

인라인 함수는 어디에도 보이지 않으며, 몸체는 호출자의 몸으로 인라인 됩니다. 더라면 add 인라인되지 않은 함수가 호출 될 것이다. 새로운 스택 프레임 생성, 인수 복사, 로컬 변수 만들기, 점프 (캐시 미스에 의한 참조의 지역성 손실) 등의 함수 호출의 오버 헤드가 발생해야합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow