programing

C에서 inline 키워드는 어떤 용도로 사용됩니까?

goodsources 2022. 7. 31. 23:03
반응형

C에서 inline 키워드는 어떤 용도로 사용됩니까?

stackoverflow에서 다음과 같은 질문을 몇 개 읽었습니다.inlineC에 있지만 아직 명확하지 않다.

  1. static inline void f(void) {}와 실질적으로 차이가 없다static void f(void) {}.
  2. inline void f(void) {}C++ 방식으로는 동작하지 않습니다.C에서는 어떻게 동작합니까?
  3. 실제 기능extern inline void f(void);할 수 있을까?

난 실제로 그 용도를 찾지 못했다.inlineC프로그램의 키워드, 그리고 다른 사람의 코드에서 이 키워드를 보면 거의 항상static inline다른 점이라고는 생각하기에static.

C 코드는, 다음의 2개의 방법으로 최적화할 수 있습니다.코드 크기 및 실행 시간의 경우.

인라인 함수:

gcc.gnu.org은 다음과 같이 말합니다.

함수를 인라인으로 선언하는 것으로, GCC 에 그 함수에의 콜을 신속히 발신하도록 지시할 수 있습니다.GCC가 이를 실현하기 위한 한 가지 방법은 해당 함수의 코드를 발신자용 코드에 통합하는 것입니다.이것에 의해, 함수 콜의 오버헤드가 배제되어 실행이 고속화됩니다.또한 실제 인수값 중 하나가 일정하면 컴파일 시에 이미 알려진 값을 통해 심플화가 가능하기 때문에 인라인 함수의 코드가 모두 포함될 필요는 없습니다.코드 사이즈에 대한 영향은 예측하기 어렵습니다.객체 코드는, 특정의 케이스에 따라, 함수의 인라이닝에 의해서 커지거나 작아지거나 할 수 있습니다.

따라서 실행 시간을 개선할 목적으로 함수를 사용하는 코드로 구성하도록 컴파일러에 지시합니다.

반복적으로 수행되는 플래그 설정/삭제 또는 비트 전환과 같은 작은 기능을 선언하면,inline코드의 크기를 희생하면서 시간에 따라 퍼포먼스가 크게 달라질 수 있습니다.


비스타틱 인라인 및 스태틱인라인

다시 gcc.gnu.org을 참조해 주세요.

인라인 함수가 스태틱하지 않은 경우 컴파일러는 다른 소스 파일로부터의 콜이 있을 수 있다고 가정해야 합니다.글로벌 심볼은 어느 프로그램에서나 1회만 정의할 수 있기 때문에 함수는 다른 소스 파일에 정의되어 있지 않기 때문에 콜을 통합할 수 없습니다.따라서 비 스태틱인라인 함수는 항상 통상적인 방법으로 자체 컴파일 됩니다.


외부 인라인?

gcc.gnu.org에서는 다음과 같이 말하고 있습니다.

함수 정의에서 inline과 extern을 모두 지정한 경우 정의는 inline에만 사용됩니다.주소를 명시적으로 참조해도 함수는 그 자체로 컴파일되지 않습니다.이러한 주소는 함수를 선언했을 뿐 정의하지 않은 것처럼 외부 참조가 됩니다.

이 인라인과 extern의 조합은 거의 매크로의 효과가 있습니다.이러한 키워드를 사용하여 함수 정의를 헤더 파일에 저장하고 정의의 다른 복사본(인라인 및 외부)을 라이브러리 파일에 저장하는 방법을 사용합니다.헤더 파일의 정의에 의해 함수에 대한 대부분의 콜이 인라인 상태가 됩니다.이 기능을 계속 사용할 경우 라이브러리의 단일 복사본을 참조합니다.


요약하면:

  1. 위해서inline void f(void){},inline정의는 현재 변환 단위에서만 유효합니다.
  2. 위해서static inline void f(void) {}스토리지 클래스는staticID에는 내부 링크와inline다른 번역 단위에서는 정의가 보이지 않습니다.
  3. 위해서extern inline void f(void);스토리지 클래스는externID에는 외부 링크가 있으며 인라인 정의에는 외부 정의도 제공됩니다.

주의: 다음 사항에 대해 이야기할 때.c파일 및.h이 답변에 있는 파일들, 나는 당신이 당신의 코드를 올바르게 배치했다고 생각합니다..c파일만 포함.h파일. 구별되는 것은,.h파일은 여러 번역 유닛에 포함할 수 있습니다.

static inline void f(void) {}와 실질적으로 차이가 없다static void f(void) {}.

ISO C에서는 이것이 맞습니다.동작은 동일합니다(물론 같은 TU에서 다르게 선언하지 않는다고 가정합니다). 유일한 실제 효과는 컴파일러가 다르게 최적화되도록 하는 것입니다.

inline void f(void) {}C++ 방식으로는 동작하지 않습니다.C에서는 어떻게 동작합니까?실제 기능extern inline void f(void);할 수 있을까?

이것은 이 답변과 이 스레드로 설명됩니다.

ISO C 및 C++ 에서는, 다음과 같이 자유롭게 사용할 수 있습니다.inline void f(void) {}헤더 파일에 포함시킬 수 있습니다.다만, 이유는 다릅니다.

ISO C에서는 외부 정의를 전혀 제공하지 않습니다.ISO C++ 에서는, 외부 정의를 제공합니다.단, C++ 에는 (C 에는 없는) 규칙이 추가되어 있습니다.단, C++ 에는, 복수의 외부 정의가 있는 경우는,inline그런 다음 컴파일러가 이를 선별하고 그 중 하나를 선택합니다.

extern inline void f(void);에 있어서.cISO C 의 파일은, 다음의 용도와 페어링 되는 것을 의미합니다.inline void f(void) {}헤더 파일에 격납되어 있습니다.변환 유닛에서 함수의 외부 정의가 출력됩니다.이렇게 하지 않으면 외부 정의가 없기 때문에 링크 오류가 발생할 수 있습니다(특정 콜의 유무는 지정되어 있지 않습니다).f외부 정의에 대한 링크 여부).

즉, ISO C 에서는, 외부 정의의 행선지를 수동으로 선택하거나, 또는 를 사용해 외부 정의 전체를 억제할 수 있습니다.static inline하지만 ISO C++에서는 컴파일러가 외부 정의의 실행 여부와 실행처를 선택합니다.

GNU C에서는 상황이 다릅니다(자세한 내용은 이하 참조).

C를 「GNU C++」라고 쓸 수 .static inline한 사람extern inlineC++는...이 는 않다.

C 프로그램에서 inline 키워드를 사용한 적이 없습니다.다른 사람의 코드에서 이 키워드를 보면 거의 항상 스태틱인라인입니다.

많은 코더들은 자신들이 무엇을 하고 있는지 모르고 그저 작동하는 것처럼 보이는 것을 조합한다.여기서 또 다른 요인은 당신이 보고 있는 코드가 ISO C가 아닌 GNU C용으로 작성되었을 수 있다는 것입니다.

GNU C에서는 플레인inlineISO C 르 르 르 르 르 iso iso iso iso iso iso로 보이는 정의를에 it제 a a a a a it it it it it it it it it it it it it it it it it it it it it it 。.h으로 inline2개의 변환 유닛에서 포함된 함수는 정의되지 않은 동작을 일으킵니다.

따라서 가 '코더'를 하려고 할 수 .inline의 최적화, 으로 GNU C의 최적화 힌트static inline필수 항목입니다.★★static inlineISO C와 GNU C에서 모두 동작하기 때문에, 사람들이 거기에 만족하고, 에러를 일으키지 않고 동작하는 것처럼 보이는 것은 당연합니다.

그 점에서는, 정적인 것만으로 큰 차이는 없습니다.

차이는 컴파일러에 speed-over-size 최적화 힌트를 제공하려는 의도일 뿐입니다.현대의 컴파일러에서는 이것은 불필요하다.

6.7.4부터 C11 사양의 기능 지정자

6 인라인 함수 지정자로 선언된 함수는 인라인 함수입니다.함수를 인라인 함수로 하는 것은 함수에 대한 호출을 가능한 138)한 빠르게 하는 것을 의미합니다.그러한 제안이 효과적인 정도는 구현에 139)정의된다.

138) 예를 들어 인라인 치환과 같은 일반적인 함수 호출 메커니즘의 대안을 사용한다.인라인 치환은 텍스트 치환이 아니며 새로운 함수를 생성하지도 않습니다.따라서 예를 들어 함수의 본문 내에서 사용되는 매크로의 확장에서는 함수가 호출되는 위치가 아니라 함수 본문이 나타나는 시점에 있던 정의를 사용합니다.식별자는 본문이 발생하는 범위 내의 선언을 말합니다.마찬가지로 함수는 외부 정의와 더불어 발생하는 인라인 정의의 수에 관계없이 단일 주소를 가집니다.

139) 예를 들어, 실장에서는 인라인 치환을 실행하지 않거나 인라인 선언 범위 내의 콜에 대해서만 인라인 치환을 실행할 수 있습니다.

이는 이 함수가 널리 사용되고 있음을 시사하며, 이 함수의 호출 시 속도를 선호하도록 요청한다.그러나 현대의 인텔리전트 컴파일러에서는 함수의 인라인 여부를 컴파일러가 결정할 수 있고 사용자의 인라인 요구를 무시할 수 있기 때문에 이는 거의 무관할 수 있습니다.왜냐하면 현대의 컴파일러는 함수를 호출하는 방법을 매우 효과적으로 결정할 수 있기 때문입니다.

static inline void f(void) {}으로 static void f(void) {}.

따라서 최신 컴파일러에서는 대부분 그렇지 않습니다.컴파일러에 따라 실제/관측 가능한 출력 차이는 없습니다.

inline void f(void) {}C++ 방 c c c c c c c c c c c c c c c c c c 。C 에 떻 c c c c c c?

어디서든 인라인인 함수는 C++의 모든 곳에서 인라인이어야 하며 링커는 여러 정의 오류를 발생시키지 않습니다(정의는 같아야 합니다).

extern inline void f(void)는 실제로 무엇을 합니까?

하면 ''를 할 수 있습니다.f ★★★★★는f는 다른 유닛에 할 수 , 콜 위해 다른 콜메커니즘을 , 콜 위해 콜메커니즘을 선택할 수도 있습니다.콜 속도를 높이기 위해 다른 콜메커니즘을 선택하거나 콜을 무시하는 경우가 있습니다.inline★★★★★★★★★★★★★★★★★★.

never extern은 never extern을 말합니다.
같은 번역단위에정의가존재해야 합니다.표준에서는 이것을 인라인 정의라고 부릅니다.
스탠드아론 오브젝트 코드는 출력되지 않으므로 이 정의는 다른 변환 유닛에서 호출할 수 없습니다.

이 예에서는 모든 선언 및 정의가 extern이 아닌 inline을 사용합니다.

// a declaration mentioning inline     
inline int max(int a, int b);

// a definition mentioning inline  
inline int max(int a, int b) {  
  return a > b ? a : b;  
}

다음은 C의 인라인 기능과 인라인 및 외부 사용에 대한 보다 명확한 설명을 제공하는 참고 자료입니다.

단어 "Inline"이 "In" "Line"을 나타내듯이, 이 키워드를 함수에 추가하면 런타임에 프로그램에 영향을 미치므로, 함수 호출이 인라인 코드보다 비용이 많이 들기 때문에 함수 호출 아래에 내부로 작성된 함수가 붙여넣어집니다.따라서 이 인라인 키워드 do의 static inline void f(void) {}와 static void f(void) {}는 실행 시 차이가 있습니다.그러나 함수에 코드 행이 너무 많으면 런타임에 영향을 주지 않습니다.static before function을 추가하면 function의 life time은 전체 프로그램의 life time이 됩니다.그리고 그 기능은 그 파일에만 사용할 수 있습니다.extern에 대한 자세한 내용은 extern 키워드가 C 함수에 미치는 영향을 참조하십시오.

언급URL : https://stackoverflow.com/questions/31108159/what-is-the-use-of-the-inline-keyword-in-c

반응형