2012-03-19 2 views
6

함수 f를 인라인으로 선언하지 않은 경우 것처럼 다음 :번역 단위와 gcc에서 자동으로 인라인 된 함수 4.6

아 :

X f(Y y); 

A.cpp :

다른 번역 단위에서 그런
X f(Y y) 
{ 
    ... 
} 

:

B.cpp :

#include "A.h" 

Z g(W w) 
{ 
    ... 
    ... f(...) ... 
    ... 
} 

그런 다음 두 번역 단위를 컴파일합니다. A.o와 B.o를 gcc 4.6과 연결 한 다음 gcc를 통해 연결합니다. (아마도 -O3에서 두 단계로)

gcc는 링크 시간에 성능을 위해 함수를 인라인하는 것을 고려할 것입니까? 아니면 너무 늦었습니까?

코드 검토에서 컴파일러가 인라인 할 때보다 잘 알고 있기 때문에 필자는 필자가 필자의 함수를 인라인으로 선언해서는 안된다고 제안했다. 함수가 헤더에 정의되어 있지 않으면 컴파일러가 인라인 할 수있는 옵션이없는 것보다 항상 인상적이었습니다.

내가 GCC 함수가 인라인 등 다양한 소스 파일로 분할하게 만들 수 있다고 생각하지 않습니다

+0

왜 그런 일을하고 싶습니까? '인라인 (inline) '은 단지 그것을 위해 발명 된 것입니다. 그것은 "다중 정의 된 기호"오류없이 헤더 파일에 함수의 정의를 가질 수있게합니다. 그리고 요즘 컴파일러는 함수를 효과적으로 인라인 할 때 좋은 전략을 가지고 있습니다. –

+0

@JensGustedt : 이유가 무엇입니까? 게으름. 차라리 옵티마이 저가 함수를 인라인하는 것이 가장 좋을 때, 스택 대신 레지스터에 로컬 변수를 넣을 때와 동일한 방식으로 함수를 인라인하는 것이 좋습니다. 나는 이것이 논쟁의 여지가없는 관점이며, 당신은 그 요점을 놓쳤다 고 생각합니다. –

+0

흠, 정확히 내가 말한 것입니다. 컴파일러에게 당신을 위해 그것을 할 기회를주십시오. 'inline'은 컴파일러에게 적절할 때 컴파일러에게 요구하는 것 외에 다른 것을 의미하지는 않습니다. 예제를 유지하기 위해 컴파일러가 레지스터에 저장하거나 유출하기로 결정한 지점에서 로컬 변수를 완전히 볼 수 있습니다. 깨끗한 코드를 작성하면 컴파일러가 도움이 될 것입니다. 솔직히 .c보다 헤더 파일에 함수를 정의하는 것이 왜 더 어렵습니까? 다른 장소에서 정확히 같은 텍스트? –

답변

12

는 GCC가 A.objX f(Y y)의 "GIMPLE"표현을 절약 할, 수 있었다. 이 표현은 일반적인 C++ 사전 처리보다 약간 더 처리되지만 많지는 않습니다. 특히 어셈블리로 변환되지 않았습니다. 결과적으로 링커는 여전히 인라인 할 수 있습니다.

+0

이 특정 시나리오에서 어떻게 작동하는지 간단한 설명을 추가 할 수 있습니까? 나는 이것에 대한 단서를 가지고 있지 않았다. –

-1

을 (대답은 C 모드 다른 경우, C++ 모드, 또는 GNU + +0 모드이 지적하시기 바랍니다). 동일한 소스 파일에서 선언 할 경우에만 작동합니다.

-1

컴파일러는 성능 향상을 위해 인라인을 선택할 수도 있고 그렇지 않을 수도 있습니다. 그러나이 경우 컴파일러는 무력하다. 함수 f를 인라인 할 수있는 방법이 없습니다.

주의 : 키워드를 사용하는 경우에도 추천 단어 만 사용하십시오. 인라인 여부에 대한 궁극적 인 결정은 컴파일러에 달려 있습니다. 그래서 거기에 컴파일러에 제안에 어떤 문제가 없습니다. LTO와 기능은 Link Time Optimization(LTO)이라고하며 GCC에서 기본적으로 4.6

[편집]을 사용할 수 없습니다

관련 문제