문제

인라인 키워드를 사용하거나 클래스 선언 ALA Short CTOR 또는 Getter 메소드에 메소드를 넣을 수 있지만 컴파일러가 내 메소드를 인화 할시기에 대한 최종 결정을 내릴 수 있습니까?

예를 들어:

inline void Foo::vLongBar()
{
   //several function calls and lines of code
}

컴파일러가 내 코드가 비효율적으로 만들 것이라고 생각되면 인라인 선언을 무시합니까?

부수적 인 문제로, 이와 같이 수업 밖에서 Getter 메소드가 선언 된 경우 :

void Foo::bar() { std::cout << "baz"; }

컴파일러가 커버 아래에 이것을 인화할까요?

도움이 되었습니까?

해결책

기능 장애가 상거되는지 여부는 하루가 끝날 무렵 컴파일러에 전적으로 달려 있습니다. 일반적으로 함수가 흐름 측면에서 복잡할수록 컴파일러가 인화 할 가능성이 줄어 듭니다. 그리고 재귀적인 기능과 같은 일부 기능은 단순히 감소 할 수 없습니다.

함수를 인화하지 않는 주요 이유는 코드의 전체 크기를 크게 증가시켜 IoT가 프로세서 캐시에서 유지되는 것을 방지하기 때문입니다. 이것은 실제로 최적화보다는 비관적이 될 것입니다.

프로그래머가 발로 또는 다른 곳에서 자신을 쏘기로 결정할 수 있도록 기능 직접 기능을 인화 할 수 있습니다.

다른 팁

예, 코드를 인화할지 여부에 대한 최종 결정은 C ++ 컴파일러에 있습니다. 인라인 키워드는 요구 사항이 아니라 제안입니다.

다음은 Microsoft C ++ 컴파일러 에서이 결정이 어떻게 처리되는지에 대한 몇 가지 세부 사항입니다.

많은 사람들이 이미 게시 한 것처럼 ForceInline과 같은 견고한 힌트를 줄 수 있더라도 최종 결정은 항상 컴파일러에 달려 있습니다.
이론적 근거의 일부는 인라인이 자동 "더 빠른"스위치가 아니라는 것입니다. 너무 많은 인라인이 코드를 훨씬 더 크게 만들 수 있으며 다른 최적화를 방해 할 수 있습니다. 보다 인라인 기능 및 성능에 대한 C ++ FAQ 라이트.

다른 사람들이 언급했듯이 inline 키워드는 단지 컴파일러가 코드를 인화하기위한 제안 일뿐입니다. 컴파일러는 정기적으로 인라인 코드가 표시되지 않았으므로 inline, 인라인 코드가 아닌 키워드는 register 또는 (사전 C ++ 0x) auto.

그러나 또 하나의 것이 있습니다 inline 키워드 효과 : 변경됩니다 결합 기능의 기능 외부 (함수의 기본값) 인라인. 인라인 링키지는 각 컴파일 장치가 자체 객체 코드 사본을 포함 할 수있게하며 링커에 최종 실행 파일에서 중복 사본을 제거하도록합니다. 템플릿을 상기시켜 주면 템플릿도 인라인 링키지를 사용합니다.

예, 컴파일러는 최종 결정이 있습니다. VS에서는 인라인 재귀 기능을 지정된 깊이로 만들 수 있습니다. ;)

#pragma inline_depth( [0... 255] )

내 5 센트를 추가하기 위해 ...

나는 이것을 찾았다 일주일의 전문가 매우 유용한 인라인에 관한 기사.

내가 기억하는 한, 링커조차도 객체 파일을 연결하고 연결되는 코드가 인쇄 될 수 있음을 알게 될 때 링커조차도 인라인을 수행 할 수있는 곳을 읽었습니다.

문안 인사,
난소

부수적 인 문제로, 이와 같이 수업 밖에서 Getter 메소드가 선언 된 경우 :

void Foo::bar() { std::cout << "baz"; }

컴파일러가 커버 아래에 이것을 인화할까요?

때에 따라 다르지. 동일한 번역 단위의 모든 발신자 ( .cpp 파일 및 모든 #included 정의). 그러나 번역 장치 외부에 해당 함수의 발신자가있을 수 있으므로 감동되지 않은 버전을 컴파일해야합니다. 높은 최적화 수준에서 직장에서 (컴파일러가 실제로 할 수있는 경우) 잠재적으로 볼 수 있습니다. (특히 : 모든 .CPP 파일을 하나의 .CPP와 일반적인 레이아웃으로 #Includ 때 발생하는 일을 비교하십시오. 하나의 번역 단위의 모든 정의를 통해 그러한 인라인에 대한 기회는 극적으로 증가합니다.)

내 지식에 따라, 컴파일러는 인라인으로 선언 한 함수 (또는 클래스 선언 내부에 쓴)가 자동으로 루프를 찾는 경우 비인라인을 자동으로 만듭니다.

당신이 정말로, 긍정적으로, 절대적으로, 절대적으로, 실패하지 않으면 코드를 인화 할 필요가 있다면, 항상 매크로가 있습니다. C는 수년 동안 이들을 지원해 왔으며 편집 전에 텍스트 교체품 일 뿐이므로 실제로, 당신이 쓰는 모든 것을 실제로 인라인으로 내려 놓았습니다.

그렇기 때문에 '인라인'키워드 (및 경우에 따라 강제 변형)가 표준적인 방법을 강요 할 수없는 이유입니다. 항상 매크로를 쓸 수 있습니다.

즉, 인라인 키워드가 종종 더 나은 경우가 많습니다. 컴파일러는 기능을 인라인으로 만드는 것이 의미가 있는지 여부와 인라인이 나머지 컴파일러 최적화와 상호 작용할 수 있기 때문에 종종 자주 알고 있기 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top