C / C++/키워드

Inline 키워드

부레두 2023. 10. 12. 02:59

1. 개요

코드의 속도와 함수의 장점을 결합한 방법으로 "컴파일러가 함수 호출에 대해 정의 부분 코드를 대체하라 표현"한 키워드

현대 컴파일러는 인라인 여부를 스스로 결정, __forceinline이나, __declspec(noinline) 키워드로 강제하지 않는 이상, inline 키워드는 거의 영향을 주지 않음


2. 특징

 

 

  • 함수 호출 부분을 모두 함수의 정의 내용으로 변경해 호출과 연관된 오버헤드가 제거되어 프로그램 속도가 빨라짐
  • 컴파일러의 재량으로 인라인 발생 가능
  • 함수가 주소를 가져오거나, 인라인 처리하기 클 경우 인라인 처리하지 않음
  • 선언 본문에 정의된 함수는 ‘암시적으로 인라인 함수’

3. 예제

/ .h
inline double Account::GetBalance()
{
    return balance;
}
  • 헤더파일에서 함수를 인라이닝 하는 이유?
    • 인라이닝 ( 기계어 레벨에서 정의를 호출부분 대신에 넣는 것 )”을 하려면 컴파일 시점에서 정의를 알아야 하는데, 헤더와 소스파일로 나누면 링크 전 까지 정의를 알 수 없기 때문에
    •  DLL이 아닌 경우, 링크 시점에 함수의 정의를 알 수 있어 링크 시점에서 인라이닝도 가능하지만 어렵고 문맥의 최적화가 어려워짐

4. 비고

컴파일러의 재량?

  • 재귀같은 내부 루프가 없는 함수가 안전하게 인라인화 가능
  • 컴파일러의 비용 분석에서 가치가 있는 경우에만 발생
  • 몇가지 경우에 대해 __forceinline도 인라인 불가
    • 함수 또는 그 콜러가 디버그 빌드의 기본 옵션으로 컴파일 된 경우
    • 함수 및 호줄자가 다양한 형식의 예외처리를 사용한 경우
    • 함수에 가변 인수 목록이 있는 경우
    • 함수 또는 컴파일되지않는 인라인 어셈블러를 사용한 경우
    • 함수가 재귀적이고 #pragam inline_recursion(on)을 설정하지 않은 경우
    • 함수가 가상함수고 호출된 경우, 가상 함수에 대한 직접 호출은 인라인 처리 가능

인라인 함수 vs 매크로 ?

  • 인라인 함수는 컴파일러에 의해 분석 vs 매크로는 전처리기에서 확장
  • 일반함수에 적용되는 모든 안전성 프로토콜을 따름
  • 인라인 함수는 함수 선언에 키워드를 포함해 inline을 한다는 점을 제외하고 다른 함수와 동일한 구문을 사용
  • 인라인 함수에 인수로 전달된 식은 한번만 계산, 매크로는 경우에 따라 여러 번 계산 할 수 있음