2010-08-07 1 views
3

함수에 대한 요구 사항이 무엇이므로 C++에서 인라인으로 실행될 수 있습니까? 함수가 인라인 될 수없는 경우가 있습니까? 또는 모든 함수가 인라인 될 수 있으며 런타임 및 컴파일 타임 고려 사항을 기반으로 함수를 정의하는 방법을 결정하는 것은 프로그래머의 책임입니다.함수가 C++에서 인라인되기위한 요구 사항

+2

인라인 onnly받는은 '요청'이다 ... 인라인 함수 컴파일러 단지 요구 인 : ... 코드와 코드의 복잡성의 길이에 의존 컴파일러. 컴파일러는 일반적으로 길이와 복잡성을 고려하여 인라인 여부를 결정하지만 컴파일러가 인라인하지 못하도록하는 것은 합법적입니다. http://stackoverflow.com/questions/1443982/when-do-compilers-inline-c-code –

답변

3

가 C에 인라인을 실행할 수 있도록 기능에 대한 요구 사항 무엇 ++?

호출되는 모든 지점에서 정의해야합니다 (일반적으로 .h에 넣음).

경우에는 이 인라인이 될 수없는 경우가 있습니까?

물론 언어 표준의 관점에서 볼 때, 각 컴파일러는 자체적으로 몇 가지 제한 사항을 구현할 수 있지만 실제로는 그렇다고 믿습니다.

또는 기능은 인라인 할 수 있으며 프로그래머의 책임 런타임 및 컴파일시 고려 사항에 근거하여 함수를 정의하는 방법을 결정하는 것입니다?

inline 키워드는 프로그래머가 정말이 기능 같은 작은 기능이 "핫"루프에서 호출되는과 (아마도 프로그래머가 발견 한 상당한 호출 오버 헤드 인라인 할 것입니다 컴파일러는 프로그래머에서 불과 힌트 프로 파일러에 표시된 것처럼 함수가 너무 작아서 호출 코드만큼 작습니다 .- 또는 함수를 인라이닝하면 특정 컴파일러가 발견하거나 할 수없는 "함수 경계를 넘어서는 최적화"가 가능합니다 달리 수행하지 마십시오 - 등). IOW는, 컴파일러가 -

컴파일러 (나는 컴파일러가 register을 무시하지만, 적은 inline를 무시합니까 ++ C를 요즘 가장 최적화 믿는다)는 변수의 저장 클래스에 대한 이전 register 힌트를 무시하는 무료 것처럼 힌트를 무시 무료입니다 그 함수가 선언되었는지 여부에 관계없이 함수 호출의 전부 또는 일부를 자유롭게 인라인 할 수 있습니다. inline.

(물론 일부 지점에서 은닉되고 다른 곳에서 사용되는 함수에 대한 명시 적 포인터를 통해 수행되거나 함수의 주소가 매개 변수로 전달 될 때 "인라인 호출"을하지 않습니다. 일부 다른 기능 -하지만 특정 호출의 인라인에 영향을 미칠 수 있습니다. 다르게 수행되는 동일한 함수에 대한 다른 호출이 반드시 필요하지는 않습니다.)

는 "이런 경우에"당신의 컴파일러는 "이 함께 주위 inline없이 코드 크기와 속도를 측정 종종 가치 컴파일러가 목적으로하는 옵션/플래그를 제공하지 않는 한 (단지 #define inline 확실히 것이다, 아주 진지하게 당신의 inline 힌트를 취 비활성화 "하여 효과를 측정 할 수 있습니다). 그러나 여러 컴파일러에 코드를 배포하려는 경우에는 특히 그렇습니다. 다중 아키텍처의 경우 CPU 아키텍처에서 컴파일러의 최적화 전략 의 차이를 고려할 때 하나의 플랫폼에서 긍정적 인 영향이 다른 플랫폼에서는 역효과를 일으킬 수 있다는 점에 유의하십시오.

5

의미에 따라 다릅니다. 다시 말하면 함수가 언제 인라인으로 확장되어 함수 호출을 제거 할 수 있는지는 컴파일러가 결정합니다. 거의 모든 기능을 인라인 할 수 있으며 요청한 거의 모든 기능을 인라인하는 것을 거부합니다. 아마도 인라인되지 않는 함수는 재귀 함수와 함수 주소를 사용했던 함수를 포함합니다. 전반적으로 이것에 대해 생각하지 않는 것이 좋습니다.

inline 키워드의 주된 용도는 인라이닝을 요청하는 것이 아니라 여러 정의 오류가 발생하지 않고 여러 번역 단위에 # 기능이 포함될 수 있음을 나타 내기위한 것입니다.

+2

+1을 참조하십시오. 하지만 많은 재귀 함수는 실제로 인라인 될 수 있습니다 (특히 꼬리 재귀 함수는 이에 국한되지 않음). –

1

또는 모든 함수가 인라인 될 수 있으며 런타임 및 컴파일 타임 고려 사항을 기반으로 함수를 정의하는 방법을 결정하는 것은 프로그래머의 책임입니다.

일부 조건을 기반으로하는 컴파일러는이 함수를 인라인 함수로 사용합니다.

4

C++에서 인라인으로 실행될 수 있도록 함수에 필요한 요구 사항은 무엇입니까? 함수가 인라인 될 수없는 경우가 있습니까?

인라인 함수는 함수 호출이 실제 코드로 대체 된 함수입니다. 이 정의에 따라 이동하면 수동으로 코드를 복사하여 붙여 넣을 수 있으며 "인라인"이됩니다. 그러나 이것이 항상 좋은 생각은 아닙니다. 속도와 프로그램 크기의 문제입니다. 함수가 커질수록 인라인을 사용하는 이점이 줄어 듭니다.

또는 모든 함수가 인라인 될 수 있으며 런타임 및 컴파일 타임 고려 사항을 기반으로 함수를 정의하는 방법을 결정하는 것은 프로그래머의 책임입니다.

일반적으로 inline 키워드를 사용하면 이는 요청 일 뿐이며 컴파일러는 실제로 함수 호출을 인라인으로 만들지 여부를 선택합니다. 많은 컴파일러가 함수를 인라인으로 만들 수있는 방법을 제공합니다 (예 : MSVC에 __forceinline 키워드가 있음).이 경우 컴파일러는 똑똑하지 않으므로 컴파일러가 컴파일 할 때 얻을 수있는 이점을 고려해야합니다. 기능을 인라인합니다.

+3

'__forceinline'조차도 모든 경우에 작동하지 않습니다 - 리팩토링 할 수없는 재귀 함수를 꼬리 재귀로 간주하십시오. 이 경우 함수에 대한 외부 호출 만 인라인 될 수 있지만 이후 호출은 인라인 될 수 없습니다. –

+0

@Konrad : 사실, 나는 그것에 대해 생각하지 않았습니다. – casablanca

+0

예, __forceinline은 실제로 컴파일러가 강제로 인라인되지 않도록합니다. – Puppy

1

인라인 함수