program story

"정적"과 "정적 인라인"기능의 차이점은 무엇입니까?

inputbox 2020. 7. 25. 10:54
반응형

"정적"과 "정적 인라인"기능의 차이점은 무엇입니까?


IMO는 모두 번역 단위의 범위를 갖도록 기능을 만듭니다.

"정적"과 "정적 인라인"기능의 차이점은 무엇입니까?

inline파일이 아닌 헤더 파일에 넣어야 .c합니까?


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에서 이는 함수 / 변수가 동일한 변환 단위 내에서만 사용될 수 있음을 의미합니다.


기본적으로 인라인 정의는 현재 번역 단위에서만 유효합니다.

스토리지 클래스가 extern인 경우 식별자에 외부 연결이 있고 인라인 정의도 외부 정의를 제공합니다.

스토리지 클래스가 static인 경우 식별자에 내부 링크가 있고 인라인 정의는 다른 변환 단위에서 보이지 않습니다.

스토리지 클래스가 지정되지 않은 경우 인라인 정의는 현재 변환 단위에서만 볼 수 있지만 식별자에는 여전히 외부 링크가 있으며 외부 정의는 다른 변환 단위로 제공해야합니다. 함수가 현재 변환 단위 내에서 호출되면 컴파일러는 인라인 또는 외부 정의를 자유롭게 사용할 수 있습니다.

컴파일러는 현재 번역 단위에서 정의를 볼 수있는 모든 함수를 인라인 할 수 있고 인라인하지 않을 수 있기 때문에 C 언어에서는 실제로 다른 변환 단위에서도 링크 타임 최적화 덕분에 C 표준이 즉, 대부분의 실제 목적을 위해 함수 정의 static차이가 없습니다 static inline.

inline(등 지정 register저장 클래스)에만 컴파일러 힌트이며, 컴파일러는 완전히 무시 무료입니다. 표준을 준수하는 비 최적화 컴파일러는 부작용을 존중하기 만하면되며 최적화 컴파일러는 명시 적 힌트를 사용하거나 사용하지 않고 이러한 최적화를 수행합니다.

inline그리고 register프로그래머가 불가능 최적화를 만들 것 코드를 쓸 때 컴파일러에 지시합니다 그들이 오류를 던져로하지만, 쓸모없는 : 외부 inline정의 할 수 없습니다 (이 다른 번역 단위에서 사용할 수없는 것처럼) 내부 링크와 참조 식별자 또는 정적 저장 시간으로 수정 가능한 로컬 변수를 정의하십시오 (이것은 상태 대 변환 단위를 공유하지 않기 때문에)- register한정 변수의 주소를 취할 수 없습니다 .

개인적으로 static헤더에 함수 정의 를 표시하는 규칙을 사용합니다. 헤더 inline정의에 함수 정의를 넣는 주된 이유는 함수 정의를 사용하지 않기 때문입니다.

일반적으로 헤더 내의 선언 외에도 static inline함수 및 static const객체 정의 만 사용 합니다 extern.

inline와 다른 스토리지 클래스 함수를 작성한 적이 없습니다 static.


GCC 내 경험에서 나는 것을 알고 staticstatic inline방식으로 어떻게 다른지 사용되지 않는 기능에 대한 컴파일러 문제 경고. 더 정확하게 말하면 static함수 를 선언 하고 현재 번역 단위에서 사용되지 않으면 컴파일러는 사용하지 않는 함수에 대한 경고를 생성하지만로 변경하면 경고를 억제 할 수 있습니다 static inline.

Thus I tend to think that static should be used in translation units and benefit from extra check compiler does to find unused functions. And static inline should be used in header files to provide functions that can be in-lined (due to absence of external linkage) without issuing warnings.

Unfortunately I cannot find any evidence for that logic. Even from GCC documentation I wasn't able to conclude that inline inhibits unused function warnings. I'd appreciate if someone will share links to description of that.


One difference that's not at the language level but the popular implementation level: certain versions of gcc will remove unreferenced static inline functions from output by default, but will keep plain static functions even if unreferenced. I'm not sure which versions this applies to, but from a practical standpoint it means it may be a good idea to always use inline for static functions in headers.


In C, static means the function or variable you define can be only used in this file(i.e. the compile unit)

So, static inline means the inline function which can be used in this file only.

EDIT:

The compile unit should be The Translation Unit

참고URL : https://stackoverflow.com/questions/7762731/whats-the-difference-between-static-and-static-inline-function

반응형