문제

어떤 사람은 사랑을 사용하여 inline 키워드 C, 고,큰 기능 헤더.때 당신은 이것을 고려하는 효과가 있습니까?나는 그것을 고려하도 언젠가 짜증나기 때문에,그것은 특이하다.

나의 원리 inline 에 사용되어야 작은 기능에 액세스는 매우 자주,나기 위해서는 실제 유형 확인합니다.어쨌든,나의 맛이 나를 안내하지만,나는 확실하지 않는 방법을 설명한 최고 이유 inline 은 그렇게 유용하지 큰 기능입니다.

이 질문 사람들이 제안하는 컴파일러는 더 나은 일을 할 수 있는 추측에서 바로 올바른 길이라는 것입니다.는 것도 나의 가정입니다.를 사용하려고 하면 이 인수,사람들은 답변 그것은 작동하지 않는 함수에서 오는 다른 개체입니다.잘 모르겠(예를 들어,사용하는 GCC).

감사에 대한 답변!

도움이 되었습니까?

해결책

inline 두 가지를 수행합니다.

  1. "하나의 정의 규칙"에서 면제를 제공합니다 (아래 참조). 이것 언제나 적용됩니다.
  2. 컴파일러에 함수 호출을 피하기 위해 힌트를 제공합니다. 컴파일러는이를 무시할 수 있습니다.

#1은 #2가 비활성화 된 경우에도 매우 유용 할 수 있습니다 (예 : 짧은 경우 헤더에 정의를 넣습니다).

실제로 컴파일러는 종종 스스로를 인화 해야하는 내용을 더 잘 수행하는 데 더 나은 작업을 수행합니다 (특히 프로파일 가이드 최적화가 가능한 경우).


편집 : 전체 참조 및 관련 텍스트

위의 두 지점은 둘 다 ISO/ANSI 표준 (ISO/IEC 9899 : 1999 (E), 일반적으로 "C99")에서 따릅니다.

§6.9 "외부 정의", 단락 5 :

an 외부 정의 함수 (인라인 정의 제외) 또는 객체의 정의 인 외부 선언입니다. 외부 연결로 선언 된 식별자가 표현식에 사용되는 경우 (그 결과 정수 상수 인 연산자의 피연산자의 일부가 아닌) 전체 프로그램의 어딘가에 식별자에 대한 정확히 하나의 외부 정의가 있어야합니다. 그렇지 않으면 하나 이상이 없을 것입니다.

C ++의 동일한 정의는 명시 적으로 하나의 정의 규칙 (ODR)으로 명명되지만 동일한 목적을 제공합니다. ex ~하지 않는 한 기능입니다 그리고 인라인.

§6.7.4, "기능 지정자"에서 인라인 키워드가 정의됩니다.

함수를 인라인 함수로 만드는 것은 함수에 대한 호출이 가능한 한 빨리임을 암시합니다.[118] 그러한 제안이 효과적인 정도는 구현 정의입니다.

각주 (비정상적인)이지만 설명을 제공합니다.

예를 들어 '인라인 대체'와 같은 일반적인 기능 호출 메커니즘에 대한 대안을 사용함으로써. 인라인 대체는 텍스트 대체가 아니며 새로운 기능을 만들지 않습니다. 따라서, 예를 들어, 함수의 본문 내에서 사용되는 매크로의 확장은 함수가 나타나는 지점에서의 정의를 사용하며 함수가 호출되는 곳이 아닌; 식별자는 신체가 발생하는 범위의 선언을 나타냅니다. 마찬가지로, 함수는 외부 정의 외에 발생하는 인라인 정의의 수에 관계없이 단일 주소를 갖습니다.

요약 : C 및 C ++의 대부분의 사용자가 인라인에서 기대하는 것은 그들이 얻는 것이 아닙니다. 기능적 통화 오버 헤드를 피하기위한 명백한 주요 목적은 완전히 선택 사항입니다. 그러나 별도의 편집을 허용하려면 단일 정의의 완화가 필요합니다.

(표준의 인용문에서 모두 강조합니다.)


편집 2 : 몇 가지 메모 :

  • 외부 인라인 함수에는 다양한 제한이 있습니다. 함수에 정적 변수를 가질 수 없으며 정적 TU 범위 객체/함수를 참조 할 수 없습니다.
  • 방금 VC ++ 's에서 보았습니다.전체 프로그램 최적화"이것은 저자보다는 자체 인라인 일을하는 컴파일러의 예입니다.

다른 팁

인라인 선언의 중요한 점은 반드시 아무것도 할 필요는 없다는 것입니다. 컴파일러는 많은 경우에 선언되지 않은 함수를 인화하고 인라인으로 선언 된 함수를 연결하기로 결정할 수 있습니다.

큰 기능에 인라인을 사용해서는 안되는 또 다른 이유는 라이브러리의 경우입니다. 인라인 함수를 변경할 때마다 구형 헤더에 대해 컴파일 된 응용 프로그램이 여전히 기존 버전의 기능을 상환했기 때문에 ABI 호환성을 느슨하게 할 수 있습니다. 인라인 함수가 TypeSafe 매크로로 사용되는 경우 라이브러리의 수명주기에서 기능을 변경할 필요가 없을 가능성이 높습니다. 그러나 큰 기능의 경우 이것은 보장하기가 어렵습니다.

물론,이 주장은 함수가 공개 API의 일부인 경우에만 적용됩니다.

인라인의 이점을 설명하는 예. sincos.h :

int16 sinLUT[ TWO_PI ]; 

static inline int16_t cos_LUT( int16_t x ) {
    return sin_LUT( x + PI_OVER_TWO )
}

static inline int16_t sin_LUT( int16_t x ) {
    return sinLUT[(uint16_t)x];
}

무거운 숫자 크 런칭을 할 때 죄/cos를 계산하는 데주기를 낭비하지 않기를 원합니다. sin/cos를 lut로 대체합니다.

컴파일러를 인라인없이 컴파일 할 때 루프를 최적화하지 않습니다 출력 .Ams는 다음의 선을 따라 무언가를 보여줄 것입니다.

;*----------------------------------------------------------------------------*
;*   SOFTWARE PIPELINE INFORMATION
;*      Disqualified loop: Loop contains a call
;*----------------------------------------------------------------------------*

인라인으로 컴파일하면 컴파일러는 루프에서 발생하는 일에 대한 지식을 가지고 있으며 무슨 일이 일어나고 있는지 정확히 알고 있기 때문에 최적화합니다.

출력 .AMS에는 최적화 된 "파이프 라인"루프가 있습니다 (즉, 모든 프로세서의 ALU를 완전히 활용하고 프로세서의 파이프 라인을 NOP없이 가득 채울 수 있습니다).


이 구체적인 경우, 나는 실시간 마감일에 필요한 것을 얻었을 때 약 2 배나 4 배의 성능을 높일 수있었습니다.


추신 나는 고정 포인트 프로세서에서 작업하고 있었다.

포인터를 사용하여 기능을 사용하면 인라인은 효과가 없습니다.

인라인은 한 가지 경우에 효과적입니다. 성능 문제가 발생하면 실제 데이터로 프로파일 러를 실행하고 일부 작은 기능이 중요한 기능이 오버 헤드를 발견했습니다.

그 외에는 왜 당신이 그것을 사용할 것인지 상상할 수 없습니다.

좋아요. 큰 기능에 인라인을 사용하면 컴파일 시간이 증가하고 응용 프로그램에 추가 성능이 거의 없습니다. 인라인 함수는 컴파일러에게 호출없이 함수가 포함되어야한다고 알려주는 데 사용되며,이를 통해 작은 코드가 여러 번 반복되어야합니다. 다시 말해 : 큰 기능의 경우, 자체 기능 구현 비용과 비교하여 통화 비용은 무시할 수 있습니다.

나는 주로 인라인 함수를 TypeSAFE 매크로로 사용합니다. 특히 LLVM이 시작된 이래로 꽤 오랫동안 GCC에 링크 시간 최적화에 대한 지원을 추가하는 것에 대한 이야기가있었습니다. 그래도 실제로 얼마나 많이 구현되었는지는 모르겠습니다.

개인적으로 나는 당신이해야한다고 생각하지 않습니다 항상 인라인, 코드에서 프로파일 러를 먼저 실행하지 않고 해당 루틴에 대한 상당한 병목 현상이 있음을 입증하지 않는 한 인라인.

이것은 Knuth가 경고 한 조기 최적화의 또 다른 사례입니다.

인라인은 작고 자주 사용되는 기능에 Getter 또는 Setter 방법에 사용할 수 있습니다. 큰 기능의 경우 exe 크기를 증가시키기 때문에 인라인을 사용하는 것이 좋지 않습니다. 또한 재귀 함수의 경우 인라인을 만들더라도 컴파일러는이를 무시합니다.

  1. inline 힌트만으로 작용합니다.
  2. 최근에만 추가되었습니다. 따라서 최신 표준 호환 컴파일러만으로 작동합니다.

인라인 함수해야 합 약 10 줄이 제공하거나,에 따라서 귀하의 컴파일러의 선택입니다.

할 수 있게 컴파일러를 당신이 뭔가를 원하는 인라인..그것까지를 컴파일러를니다.거기에 아무도 힘-인라인 옵션을 제가 알기로는 컴파일러를 무시할 수 없습.그 이유는 너야에서 어셈블러를 출력하고 당신의 컴파일러 인라인 기능을 하지 않을 경우,왜?여러 컴파일러는 그냥 조용히 말하는'나사를!'에는 존중합니다.

그렇다면:

정체되는 인라인 unsigned int foo(const char*막대기)

..개선되지 않는 것을 통해 static int foo()그 시간을 다시 방문하고 최적화(및 가 루프)또는 주장으로 귀하의 컴파일러입니다.각별한 관심을 기울이고 주장하는 컴파일러,먼지 않는 사람들은 그것을 개발하는..또는 단지에서 저장에 대한 많은 불쾌한 읽을 열 때 받은편지함입니다.

는 경우 한편,무언가를 만들기(또는려 무언가를 만들)인라인으로는 그렇게 하면 실제로 정당화 부풀게?당신이 정말로 원하는 기능 확장 시간는?은 뛰어 너무 비용이 많이 드는?, 귀하의 컴파일러는 일반적으로 올바른 9/10 시간을 확인,중간 출력(또는 asm 덤프).

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