[C++] 인라인 함수 ④ ( C++ 컴파일 최적화 - inline 키워드로 수정되지 않은 함수도 인라인될 수 있음 | C++ 컴파일러 인라인 제한 사항 | 인라인 실패의 여러 경우 )





1. C++ 컴파일러 최적화 - inline 키워드로 수정되지 않은 함수도 인라인될 수 있습니다.




1. 함수 인라인의 불확실성



현재 C++ 컴파일러는 컴파일하고 최적화할 수 있습니다.

  • inline으로 선언된 인라인 함수는 컴파일러에서 인라인 처리가 허용되지 않을 수 있습니다.
  • 인라인 선언을 사용하지 않는 일반 함수는 자주 호출되면 컴파일러는 실행 효율성을 높이기 위해 인라인할 수 있습니다.

인라인 함수의 불확실성: 컴파일러 인라인 함수는 컴파일러 최적화 전략 및 코드 특성을 기반으로 결정 됩니다.

  • 모든 함수가 인라인된다는 보장은 없습니다.
  • 함수가 인라인 처리되더라도 프로그램 성능이 향상된다는 보장은 없습니다.

2. C++ 컴파일러의 인라인 최적화


단순하고 자주 호출되는 함수의 인라인화는 성공 확률이 높고, 복잡한 함수의 인라인화는 실패 확률이 높습니다.인라인화에 성공하면 코드 크기가 커지고 프로그램 실행 속도가 느려질 수 있습니다.

C++ 컴파일러의 매개변수와 최적화 수준을 조정하여 컴파일된 프로그램의 실행 효과를 최적화할 수 있습니다.


3. 인라인 최적화 세부정보


inline 키워드로 함수를 수정하지 않더라도 C++ 컴파일러는 함수 특성과 호출 빈도 , 현재 프로그램 실행 효율성 및 전반적인 성능을 고려하여 함수를 인라인할지 여부를 결정합니다 .


인라인 함수의 목적은 함수 호출의 오버헤드를 줄이고 프로그램의 실행 효율성을 높이는 것입니다.

컴파일러는 함수를 인라인할지 여부를 결정할 때 함수의 복잡성, 크기 및 호출 수와 같은 요소를 고려합니다 .

함수가 상대적으로 간단하고 자주 호출되는 경우 컴파일러는 프로그램의 실행 효율성을 높이기 위해 함수를 인라인하도록 선택할 수 있습니다.





2. C++ 컴파일러 인라인 제한 사항




1. 인라인 실패의 여러 상황


인라인 실패의 여러 경우: 인라인 함수가 다음과 같은 조건을 갖는 경우, 인라인 키워드를 사용하여 인라인 함수를 선언하더라도 유효하지 않습니다.

  • 함수에 루프가 있습니다. 인라인 함수에는 for / foreach / while / do while 루프와 같은 어떤 형태의 루프 문도 있을 수 없습니다 .
  • 함수에 조건판단이 많다: 인라인 함수에는 조건판단문이 너무 많아서는 안 되며 , 조건판단은 유효하지 않은 명령이 있다는 뜻이므로 공간낭비가 된다. 일반적으로 20개를 넘지 않아야 한다. 30개의 조건부 판단문, 구체적인 개수는 컴파일러 구성에 따라 결정될 수 있습니다.
  • 함수 본문은 거대합니다. 함수 본문의 코드는 너무 많아서는 안 됩니다. 함수 명령이 너무 많으면 호출 위치에 많은 명령이 삽입되어 코드 공간이 많이 낭비됩니다.
  • 함수의 주소 얻기: 함수를 호출할 때 함수의 주소를 얻으려고 시도한다. 인라인 함수가 존재하지 않기 때문에 컴파일 중에 호출 위치에 직접 삽입된다. 인라인 함수의 주소를 얻으면 프로그램이 실행되지 않습니다. 따라서 일단 함수 인라인 함수 주소의 주소를 얻으려고 하면 인라인이 직접 실패합니다.
  • 인라인 함수의 선언은 호출 후입니다. 인라인 함수는 선언할 수 없으므로 인라인 함수의 선언과 정의가 함께 있어야 합니다. 선언과 정의보다 먼저 인라인 함수를 호출하면 인라인 함수가 다음을 갖음을 의미합니다 . 별도로 선언되었으며 함수의 인라인 처리는 확실히 실패하며 일반 함수로 처리됩니다.

2. 인라인 실패의 본질 분석


함수에 루프문이 있는 경우 / 조건부 판단문이 많은 경우 / 함수 본체가 크다 / 함수의 주소에 대해 연산을 수행하는 경우 / 인라인 함수를 별도로 선언 하는 경우 인라인 인라인 함수를 작성하더라도 컴파일러가 인라인 요청에 동의하지 않습니다. ;


일반 함수와 비교할 때 인라인 함수의 장점은 함수 호출 시 푸시/점프/반환의 오버헤드를 절약할 수 있다는 것입니다.

함수 본문이 너무 크 거나 특수 작업을 수행하는 데 따른 실행 오버헤드가 푸시/점프/반환의 오버헤드보다 훨씬 큰 경우 인라인 함수는 프로그램의 전체 성능을 저하시키고 컴파일러는 함수의 영향을 평가합니다. 두 가지는 성능에 대해 동의하고 함수의 인라인 요청을 거부합니다.

Je suppose que tu aimes

Origine blog.csdn.net/han1202012/article/details/132644388
conseillé
Classement