2011-03-07 1 views
14

C++에서 키워드 "인라인"은 두 가지 용도로 사용됩니다. 첫째, 정의를 여러 번역 단위로 나타낼 수 있습니다. 둘째, 컴파일 된 코드에서 함수를 인라인해야한다는 힌트가 컴파일러에게 있습니다.C++의 "인라인"- GCC와 Clang/LLVM에 대한 힌트가 얼마나 강한가요?

내 질문 : GCC 및 Clang/LLVM에 의해 생성 된 코드에서 키워드 "인라인"이 이 되나요? 함수가 인라인되었는지 여부를 나타내는이 있습니까? 그렇다면 어떤 상황입니까? 아니면 힌트가 완전히 무시 되었습니까? 이것은 언어 질문이 아니라 컴파일러 관련 질문입니다.

+0

@Ashot에 동의합니다. 질문에 대한 답변을 수락하면 더 많은 사람들이 답변을 기다릴 수 있습니다. 그것이 그대로, 내 대답은 추측에 더 가깝고 실제 "프로"답변이 필요할 수 있습니다. –

+1

아, 나는 그것을 할 필요가 있다는 것을 깨닫지 못했지만 지금은 그렇게 할 것입니다. – emchristiansen

답변

9

[주의 : C++/GCC 전문가가 아닙니다] inline here에서 읽으십시오.

Also, this, for GCC/C99.

인라인 함수 지정자를 사용하여 만든 제안 효과적되는 범위 (C99 6.7.4).

  • -fno-inline 옵션이 이거나 -O0이 사용되면 GCC는 모든 함수를 인라인하지 않습니다. 그렇지 않으면 GCC 이 여전히 여러 가지 이유로 함수를 인라인 할 수 없습니다. -Winline 옵션을 사용하여 함수가 인라인되지 않았는지와 그렇지 않은지를 확인할 수 있습니다.

그래서 당신의 컴파일러 설정 (같은 -fno-inline 또는 -O0)을 사용하지 않는 경우, 컴파일러는 힌트를 취 것으로 보인다. Clang/LLVM (또는 GCC)에 대해서는 언급 할 수 없습니다. '

코드 골프 관련 질문이 아니며 상황을 알아야 할 경우 -Winline을 사용하는 것이 좋습니다.

+0

@Ashot, 편집 해 주셔서 감사합니다. –

+0

또한 C99와 http://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Implementation에 따라 설명서에이 내용이 추가되어야한다고 추가해야합니다.html # C_002b_002b - 구현은 C++ (g ++)에도 유효합니다. – UmmaGumma

+0

@Ashot 감사합니다. 나는 다른 표준들에 비해 매우 큰 편이 아닙니다. 최신 (C99/GNU99 또는 무엇이든)이 아닌 다른 것으로 컴파일하는 경우 이유를 알아야합니다. –

4

힌트의 강도는 전적으로 사용하는 컴파일 옵션에 따라 다릅니다. 대부분의 컴파일러에는 인라인을 수행하지 않고 '인라인'이라고 표시된 행만 인라인하거나 최선의 판단을 사용하고 힌트를 무시하는 옵션이 있습니다.

마지막으로 가장 잘 작동하는 것 같습니다. :-)

7

gcc: An Inline Function is As Fast As a Macro에서 흥미로운 설명 :

일부 통화가 특히 ( 여러 가지 이유로 통합 할 수 없습니다

, 통합 될 수없는 함수의 정의 앞에 를 호출하고, 어느 쪽도 재귀 정의 내의 통화). 통합되지 않은 호출이있는 경우 함수는 일반적으로 으로 어셈블러 코드로 컴파일됩니다. 은 해당 프로그램을 이 해당 주소를 참조 할 경우 이 인라인 될 수 없으므로 컴파일 될 때까지 이어야합니다. 함수 정의 특정 용도가 인라인 교체하기에 부적합 할 수 있음은

참고.이러한 사용에는 : varargs 사용, alloca를 사용하는 가변 크기의 데이터를 사용 유형 (가변 길이 참조) 계산 오도의 사용은, 비 로컬 고토 사용 (값으로 라벨 참조)와 중첩 함수 (중첩 된 기능 참조). 인라인으로 표시된 기능을 으로 바꿀 수 없으면 -Winline을 사용하면 경고 메시지가 표시되고 그 이유는 입니다. ISO C++의 요구에 따라

는, GCC는 명시 적으로 인라인 키워드로 선언 없는 경우에도 인라인 를 표시하는 클래스의 신체 내에서 정의 멤버 함수를 고려합니다. 은 이것을 -fno-default-inline으로 대체 할 수 있습니다. C++ 방언 제어 옵션을 참조하십시오. 이 최적화되지 때 `always_inline를 지정하지 않는

GCC는 어떤 기능을 인라인하지 않습니다 '이처럼 기능에 대한 속성 :

/* Prototype. */ 
inline void foo (const char) __attribute__((always_inline)); The remainder of this section is specific 

을 GNU C90 인라인에.

인라인 함수가 정적이 아닌 경우 컴파일러는 이 파일의 호출이있을 수 있다고 가정해야합니다. 전역 심볼은 임의의 프로그램에서 한번만 정의 된 이 될 수 있으므로 함수는 다른 소스 파일에 정의되어서는 안되기 때문에 콜을 통합 할 수 없습니다. 따라서 정적이 아닌 인라인 함수는 항상 자체적으로 에서 컴파일됩니다.

함수 정의에서 인라인과 extern을 모두 지정하면 정의가 인라인에만 사용됩니다. 주소를 명시 적으로 참조하더라도 함수가 에 컴파일되지 않습니다. 이러한 주소 인 은 마치 처럼 함수가 선언 된 경우에만 이고 정의하지 않은 것처럼 외부 참조가됩니다.

인라인과 extern의 조합 인 은 매크로의 영향을 거의받습니다. 사용 방법은 정의를이 키워드로 헤더 파일에 넣고 정의 (인라인 및 extern이 없음)의 다른 복사본을 라이브러리 파일에 넣는 것입니다. 헤더 파일을 에 정의하면 함수에 대한 대부분의 호출이 인라인됩니다 ( ). 이 기능의 사용이 인 경우 은 라이브러리의 단일 복사본을 나타냅니다.

+0

마지막 굵은 글씨에 관한 질문 : "함수의 사용이 남아 있다면"의 실제 의미는 무엇입니까? 어떤 경우에 이런 일이 발생합니까? –

+0

@ el_technic0 함수를 사용하거나 호출하면 함수가 사용됩니다. –

+0

"함수에 대한 대부분의 호출은 인라인 될 것"과 "함수의 나머지 사용은 라이브러리의 단일 복사본을 참조합니다"의 차이점을 여전히 이해하지 못합니다. 두 가지 시나리오의 예를 들려 줄 수 있습니까? –

관련 문제