programing

"static" 기능과 "static inline" 기능의 차이점은 무엇입니까?

firstcheck 2022. 7. 31. 21:29
반응형

"static" 기능과 "static inline" 기능의 차이점은 무엇입니까?

IMO는 모두 변환 유닛의 범위만을 가지는 기능을 만듭니다.

"static" 기능과 "static inline" 기능의 차이점은 무엇입니까?

왜 그래야 하는가?inline가 아닌 헤더 파일에 저장되다.c파일링?

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

저장소 클래스가externID에는 외부 링크가 있으며 인라인 정의에는 외부 정의도 제공됩니다.

저장소 클래스가staticID에는 내부 링크가 있으며 인라인 정의는 다른 변환 단위에서는 보이지 않습니다.

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

컴파일러는 현재 변환 유닛에서 정의가 보이는 함수를 인라인(및 인라인화하지 않음)할 수 있기 때문에(또한 링크 타임 최적화 덕분에, 다른 변환 유닛에서도, 비록 C 표준이 실제로 그것을 설명하지는 않지만), 대부분의 실용적인 목적을 위해, 두 함수의 차이는 없습니다.static그리고.static inline함수의 정의.

inline지정자(예:register스토리지 클래스)는 컴파일러 힌트에 불과하며 컴파일러는 이를 완전히 무시할 수 있습니다.표준에 준거한 최적화되지 않은 컴파일러는 그 부작용만 고려해야 하며, 컴파일러를 최적화하면 명시적인 힌트가 있든 없든 이러한 최적화가 이루어집니다.

inline그리고.register그러나 프로그래머가 최적화를 불가능하게 만드는 코드를 쓸 때 오류를 발생시키도록 컴파일러에 지시하기 때문에 도움이 되지 않습니다.외장inline정의에서는 내부 링크 ID를 참조할 수 없습니다(다른 변환 유닛에서는 사용할 수 없기 때문에).또, 정적 스토리지 기간(이러한 변수는 변환 유닛간에 상태를 공유할 수 없기 때문에), 다음의 주소를 지정할 수 없습니다.register- 변수 - 수식 변수. - 수식 변수.

개인적으로, 저는 이 관습을 사용하여static 내의 도 " " " 입니다.inline헤더 파일에 함수 정의를 넣는 주된 이유는 함수 정의를 인라이닝할 수 없게 하기 위해서입니다.

★★★★★★★★★★★★★만 사용합니다.static inline 과 " " " 입니다.static const 및 " " " " object object object object object object 。extern선언을 지정합니다.

한 도 써본 적이 없어요.inline 가 다른 static.

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

GCC의 경험을 통해 알 수 있습니다.static그리고.static inline컴파일러가 사용하지 않는 함수에 대해 경고를 발행하는 방식이 다릅니다.더 정확히 말하면static현재 번역 유닛에서 사용되지 않는 함수로 인해 컴파일러는 사용되지 않는 함수에 대한 경고를 생성하지만, 이 경고는 로 변경함으로써 금지할 수 있습니다.static inline.

그래서 나는 그렇게 생각하는 경향이 있다.static는 번역 단위로 사용해야 하며 사용하지 않는 함수를 찾기 위해 추가 체크 컴파일러를 사용하는 것이 좋습니다.그리고.static inline(외부 링크의 부재로 인해) 경고를 발행하지 않고 인라인화할 수 있는 기능을 제공하기 위해 헤더 파일에서 사용해야 합니다.

불행하게도 나는 그 논리에 대한 어떤 증거도 찾을 수 없다.GCC 문서에서도 저는 결론을 내릴 수 없었습니다.inline는 사용되지 않는 기능 경고를 억제합니다.그것에 대한 설명에 대한 링크를 공유해 주시면 감사하겠습니다.

주식회사,static정의한 함수 또는 변수는 이 파일(즉 컴파일 유닛)에서만 사용할 수 있습니다.

그렇게,static inline는 이 파일에서만 사용할 수 있는 인라인 함수를 의미합니다.

편집:

컴파일 유닛은 번역 유닛이어야 합니다.

언어 레벨이 아닌 일반적인 구현 레벨의 차이점: 특정 버전의 gcc는 참조되지 않은 것을 삭제합니다.static inline디폴트로는 출력되지 않지만 플레인 상태로 유지됩니다.static는 참조되지 않은 경우에도 기능합니다.어떤 버전에 적용되는지 모르겠지만 실용적인 관점에서 보면 항상 사용하는 것이 좋을 수 있습니다.inline위해서static헤더 내의 함수입니다.

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

반응형