Program Club

C ++ 인라인 함수?

proclub 2020. 11. 7. 10:39
반응형

C ++ 인라인 함수?


왜 이렇게해야합니까?

inline double square (double x) { return x*x;}

대신에

double square (double x) { return x*x;}

차이가 있습니까?


전자 (사용 inline)를 사용하면 여러 소스 파일에 포함될 수있는 헤더 파일에 해당 함수를 넣을 수 있습니다. 를 사용 inline하면 식별자를 선언하는 것처럼 파일 범위 에서 식별자가 생성 됩니다static . 를 사용하지 않으면 inline링커에서 다중 기호 정의 오류가 발생합니다.

물론 이것은 함수 가 사용되는 위치에 인라인 으로 컴파일되어야한다는 컴파일러에 대한 힌트에 추가 되는 것입니다 (함수 호출 오버 헤드 방지). 컴파일러는 inline힌트에 따라 작동 할 필요가 없습니다 .


네, 차이가 있습니다. https://isocpp.org/wiki/faq/inline-functions .

함수를 인라인으로 지정하면 컴파일러가 메서드의 코드를 호출되는 위치에 배치하게됩니다.

void myfunc() {
  square(2);
}

~와 동일하다

void myfunc() {
   2 * 2;
}

함수 호출은 코드 명확성을 위해 좋지만 해당 함수가 호출되면 로컬 상태를 스택으로 푸시해야하며 메서드에 대한 새 로컬 상태가 설정되고 완료되면 이전 상태를 팝해야합니다. 그것은 많은 오버 헤드입니다.

이제 최적화 수준을 높이면 컴파일러가 루프 풀기 또는 함수 인라인과 같은 결정을 내립니다. 컴파일러는 여전히 인라인 문을 무시할 수 있습니다.


현대 컴파일러에서는 그다지 차이가 ​​없을 것입니다. 그것은하지 않고 인라인 될 수 있습니다 inline그것은 수 없습니다 인라인 으로inline .


Wikipedia에서 : 인라인 함수는 컴파일러가 인라인 확장을 수행하도록 요청 된 함수입니다. 즉, 프로그래머는 함수가 정의 된 한 곳에서 함수를 호출하는 코드를 생성하는 대신 컴파일러가 함수가 호출되는 모든 위치에 함수의 전체 본문을 삽입하도록 요청했습니다. 컴파일러는이 요청을 존중할 의무가 없습니다.

http://en.wikipedia.org/wiki/Inline_function


컴파일러가 준수하는 경우 인라인 함수는 함수가 호출되지 않은 것처럼 (호출 함수에 로직을 넣은 것처럼) 호출 된 코드에 인라인 함수를 포함하고 함수 호출 오버 헤드를 방지합니다.


inline절차 적 추상화 의 개념과 잘 작동합니다 .

inline double square (double x) { return x*x;}

int squareTwice(double x) {
    double first = square(x);
    double second = square(x);
    return first * second; 
}

위의 내용은 기본적으로 다음과 유사합니다.

int squareTwice(double x) {
    double first = x*x;
    double second = x*x;
    return first * second; 
}

이는 컴파일러가 함수 호출을 인라인 확장 할 때 함수의 코드가 호출자의 코드 스트림에 삽입되기 때문에 발생합니다. 따라서 두 번째 예를 첫 번째 예에 대해 절차 적으로 추상화하는 것이 더 쉬울 수 있습니다.

절차 적 추상화를 사용하면 루틴을 훨씬 읽기 쉬운 작은 서브 루틴으로 나눌 수 있습니다 (스타일 선택이 될 수 있음).

참고 URL : https://stackoverflow.com/questions/5971736/c-inline-function

반응형