답변:
inline
컴파일러가 실제 호출을 실행하는 대신 호출 코드에 함수 내용 을 포함 하도록 지시합니다 .
자주 호출되는 작은 기능으로 성능에 큰 차이를 만들 수 있습니다.
그러나 이것은 "힌트"일 뿐이며 컴파일러는이를 무시할 수 있으며, 대부분의 컴파일러는 가능한 경우 최적화의 일부로 키워드가 사용되지 않는 경우에도 "인라인"을 시도합니다.
예를 들면 :
static int Inc(int i) {return i+1};
.... // some code
int i;
.... // some more code
for (i=0; i<999999; i = Inc(i)) {/*do something here*/};
이 긴밀한 루프는 각 반복에서 함수 호출을 수행하며 함수 내용은 실제로 컴파일러가 호출을 수행하는 데 필요한 코드보다 훨씬 적습니다. inline
본질적으로 컴파일러에게 위의 코드를 다음과 같은 코드로 변환하도록 지시합니다.
int i;
....
for (i=0; i<999999; i = i+1) { /* do something here */};
실제 함수 호출을 건너 뛰고 반환
분명히 이것은 실제 코드가 아닌 요점을 보여주는 예제입니다.
static
범위를 나타냅니다. C에서는 함수 / 변수가 동일한 번역 단위 내에서만 사용될 수 있음을 의미합니다.
static
(포함 또는 제외 inline
) 헤더에 완벽하게 포함될 수 있습니다. 이유가 없습니다. 템플릿은 C입니다 ++,이 질문은 C.에 관한 것입니다
inline
IMO, 좋은 스타일이다
inline
하지 않습니다 . 프로그래머가 ODR 위반없이 여러 번역 단위에 함수 본문을 포함 할 수 있도록합니다. 이것의 부작용은 컴파일러 가 함수를 인라인 할 때 실제로 이것을 할 수있게한다는 것 입니다.
기본적으로 인라인 정의는 현재 번역 단위에서만 유효합니다.
스토리지 클래스가 extern
인 경우 식별자에는 외부 연결이 있으며 인라인 정의는 외부 정의도 제공합니다.
스토리지 클래스가 static
인 경우 식별자에는 내부 연결이 있고 다른 번역 단위에서는 인라인 정의가 표시되지 않습니다.
스토리지 클래스가 지정되지 않은 경우 인라인 정의는 현재 번역 단위에서만 볼 수 있지만 식별자에는 여전히 외부 연결이 있으며 외부 정의는 다른 번역 단위에 제공되어야합니다. 현재 번역 단위 내에서 함수가 호출되는 경우 컴파일러는 인라인 또는 외부 정의를 자유롭게 사용할 수 있습니다.
컴파일러는 현재 번역 단위에서 정의가 표시되는 모든 함수를 인라인 (인라인하지 않음) 할 수 있으므로 C 표준이 실제로 설명하지는 않지만 다른 번역 단위에서도 링크 시간 최적화 덕분에 즉), 대부분의 실용적인 목적을 위해 static
와 사이에는 차이가 없습니다.static inline
함수 정의 .
inline
(등 지정 register
저장 클래스)에만 컴파일러 힌트이며, 컴파일러는 완전히 무시 무료입니다. 표준 준수 비 최적화 컴파일러는 부작용 만 고려하면되며 최적화 컴파일러는 명시 적 힌트를 사용하거나 사용하지 않고 이러한 최적화를 수행합니다.
inline
그리고 register
프로그래머가 불가능 최적화를 만들 것 코드를 쓸 때 컴파일러에 지시합니다 그들이 오류를 던져로하지만, 쓸모없는 : 외부 inline
정의 할 수 없습니다 (이 다른 번역 단위에서 사용할 수없는 것처럼) 내부 링크와 참조 식별자 또는 정적 저장 기간으로 수정 가능한 지역 변수를 정의하고 (이들은 번역 단위 간 상태를 공유하지 않기 때문에) register
한정된 변수의 주소를 사용할 수 없습니다 .
개인적으로, 나는 마크에 규칙을 사용 static
또한 헤더 내에서 함수 정의 inline
헤더 파일에 함수 정의를 착용하는 주된 이유로하는 것은, 그들이 inlinable 확인하는 것입니다.
일반적으로 헤더 내의 선언 외에 static inline
함수 및 static const
객체 정의 만 사용 합니다 extern
.
.NET inline
과 다른 스토리지 클래스 로 함수를 작성한 적이 없습니다 static
.
inline
실제로 인라이닝에 적용된 것처럼 말하는 모든 답변 은 오해의 소지가 있으며 틀림없이 정확합니다. 어떤 현대 컴파일러도이를 인라인하기위한 힌트로 사용하거나 함수 인라인을 활성화하기 위해이를 요구하지 않습니다.
static
와 static inline
. 둘 다 다른 번역 단위에서 정의를 보이지 않게 만듭니다. 그래서 static inline
대신 쓰는 합리적인 이유 는 static
무엇입니까?
GCC 내 경험에서 나는 것을 알고 static
및 static inline
방식으로 어떻게 다른지 사용되지 않는 기능에 대한 컴파일러 문제 경고. 보다 정확하게 static
함수 를 선언 하고 현재 번역 단위에서 사용되지 않을 때 컴파일러는 사용하지 않는 함수에 대한 경고를 생성하지만 static inline
.
따라서 나는 그것이 static
번역 단위에서 사용되어야 한다고 생각하고 사용하지 않는 함수를 찾기 위해 컴파일러가하는 추가 검사의 이점을 얻는다. 그리고 static inline
경고를 발행하지 않고 인라인 될 수있는 (외부 링크가 없기 때문에) 함수를 제공하기 위해 헤더 파일에서 사용되어야합니다.
불행히도 그 논리에 대한 증거를 찾을 수 없습니다. GCC 문서에서도 inline
사용하지 않는 함수 경고 를 금지 한다는 결론을 내릴 수 없었습니다 . 누군가가 그것에 대한 설명에 대한 링크를 공유하면 감사하겠습니다.
warning: unused function 'function' [clang-diagnostic-unused-function]
A의 static inline
건물 때 기능을 clang-tidy
다른 번역 단위에 사용된다 (v8.0.1에서). 그러나 이것은 static
& inline
! 를 결합하는 가장 좋은 설명이자 이유 중 하나입니다 .
C에서 static
정의한 함수 또는 변수는이 파일 (즉, 컴파일 단위)에서만 사용할 수 있음을 의미합니다.
따라서이 static inline
파일에서만 사용할 수있는 인라인 함수를 의미합니다.
편집하다:
컴파일 단위 는 번역 단위 여야합니다 .
the compile unit
잘못 쓴 것이라고 믿습니다. 그런 것은 없습니다. 실제 용어는translation unit
한 가지 차이점은 언어 수준이 아니라 널리 사용되는 구현 수준입니다. 특정 버전의 gcc는 static inline
기본적으로 출력에서 참조되지 않은 함수를 제거 하지만 static
참조되지 않더라도 일반 함수 는 유지 합니다. 나는 확실히이 적용되는 버전 아니지만, 실용적인 관점에서 항상 사용하는 것이 좋습니다 수 있습니다 의미 inline
에 대한 static
헤더 기능을합니다.
inline
정의에서 사용하는 것은 어떻습니까? extern
기능 에도 사용하지 않는다는 의미 입니까?
attribute((used))
asm이 참조되지 않은 static
함수 및 데이터 를 참조 할 수 있도록 허용하는 사용 내역 과 사용을 살펴보면 알 수 있습니다.
static
범위를 나타냅니다. C에서는 함수 / 변수가 동일한 번역 단위 내에서만 사용될 수 있음을 의미합니다.