문제

C ++에서 인라인 함수 호출을 테스트하고 있습니다.

Thread model: win32
gcc version 4.3.3 (4.3.3-tdm-1 mingw32)

C ++ 프로그래밍 언어의 Stroustrup :

인라인 지정자는 컴파일러에 대한 힌트로, 함수의 코드를 한 번 내려 놓지 않고 일반적인 기능 호출 메커니즘을 호출하는 대신 코드 [...] 인라인을 생성해야한다는 힌트입니다.

그러나 생성 된 코드가 단순히 인라인이 아니라는 것을 알았습니다. 이있다 전화 에 대한 계측 Isquare 기능.

alt text

왜 이런 일이 일어나고 있습니까? 그렇다면 인라인 함수를 어떻게 사용할 수 있습니까?

편집하다: 사용 된 명령 줄 옵션 :

**** Build of configuration Debug for project InlineCpp ****

**** Internal Builder is used for build               ****
g++ -O0 -g3 -Wall -c -fmessage-length=0 -osrc\InlineCpp.o ..\src\InlineCpp.cpp
g++ -oInlineCpp.exe src\InlineCpp.o
도움이 되었습니까?

해결책

컴파일러가 인라인 함수를 생성하도록 강제하는 일반적인 C ++ 방법은 없습니다. 당신이 인용 한 텍스트에서 '힌트'라는 단어를 주목하십시오 - 컴파일러는 당신의 말을들을 의무가 없습니다.

실제로, 절대적으로 인라인으로 무언가를 만들어야한다면, 컴파일러 특정 키워드가 필요하거나 함수 대신 매크로를 사용해야합니다.

편집 : NJSF는 응답에 적절한 GCC 키워드를 제공합니다.

다른 팁

Michael Kohne과 같이 언급 한 것처럼 인라인 키워드는 항상 힌트이며, 기능의 경우 GCC는 그것을 인라인하지 않기로 결정했습니다.

GCC를 사용하고 있으므로 __attribute ((always_inline)을 인라인으로 강제 할 수 있습니다.

예시:

 /* Prototype.  */
 inline void foo (const char) __attribute__((always_inline));

원천:GCC 인라인 문서

디버그 빌드 (최적화 비활성화)를보고 있습니까? 컴파일러는 일반적으로 "디버그"빌드에서 인라인을 비활성화하여 디버깅을 어렵게 만들기 때문에 비활성화됩니다.

어쨌든 inline 지정된 것은 실제로 a입니다 힌트. 컴파일러는 함수를 인화 할 필요가 없습니다. 모든 컴파일러가 인라인 힌트를 무시하기로 결정할 수있는 여러 가지 이유가 있습니다.

  • 컴파일러는 간단 할 수 있으며 인라인을 지원하지 않을 수 있습니다.
  • 컴파일러는 내부 알고리즘을 사용하여 인라인을 인라인으로 결정하고 힌트를 무시할 수 있습니다.
    (때로는 컴파일러가 특히 IA64와 같은 복잡한 아키텍처에서 인라인해야 할 일을 선택할 수있는 것보다 더 나은 작업을 수행 할 수 있습니다.)
  • 컴파일러는 자체 휴리스틱을 사용하여 힌트에도 불구하고 인라인이 성능을 향상시키지 않을 것이라고 결정할 수 있습니다.

인라인은 컴파일러에 대한 제안에 지나지 않습니다.이 기능을 인라인 할 수 있다면 컴파일러는 그렇게하는 것을 고려해야합니다. 일부 기능은 매우 간단하기 때문에 자동으로 인라인 및 기타 기능을 수행합니다. 제안하다 그것은 복잡하기 때문에 인기가 없다.

또한 디버그 빌드를하고 있음을 알았습니다. 실제로는 모르겠지만 컴파일러가 디버거 빌드에 대한 인라인을 비활성화 할 수 있습니다. 디버거가 어려워지기 때문입니다 ...

그것은 힌트이며, 칭찬자는 힌트를 무시하기 위해 선택할 수 있습니다. 나는 그 GCC가 일반적으로 그것을 무시하는 곳을 읽은 것 같아요. 나는 깃발이 있었지만 여전히 100%의 경우에도 효과가 없다. (아직 링크를 찾지 못했습니다).

플래그 : -finline -funtions는 -o3 최적화 수준에서 켜집니다.

인라인의 여부는 컴파일러에 달려 있습니다. 무시할 수 있습니다 인라인 힌트. 일부 컴파일러에는 특정 키워드가 있습니다 (예 : __forceinline VC ++)에서는 가상 멤버 기능에 대한 키워드 가상 호출이 있더라도 인식되지 않습니다.

비슷한 문제에 직면하여 인라인 함수가 헤더 파일로 작성된 경우에만 작동한다는 것을 알았습니다.

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